diff --git a/Changelog b/Changelog index 40d45b8..9da3e10 100644 --- a/Changelog +++ b/Changelog @@ -1,4 +1,23 @@ -*-text-*- +1.4.1: +Fixed https://rt.cpan.org/Ticket/Display.html?id=155578: + +Feeding a new entry into note from STDIN didn't work correctly +anymore. Using the default builtin config and no config file it didn't +work at all. Now it works as one would expect. A bare - as argument +ALWAYS reads a new entry from STDIN. The same happens if one uses -n +-. In addition note now prints a message if it attempts to read from +STDIN to avoid confusion. + +The parameter -n has been added to be able to force note to create a +new entry directly from commandline, regardless of any configuration. + +Fixed regex to check if a note has been specified as argument. Now it +does not match a bare - anymore. + +Reorganized a little code. + + 1.4.1: Fixed https://github.com/TLINDEN/note/issues/11: diff --git a/README.md b/README.md index 1602d0b..b64558b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # note - a perl script for maintaining notes. -This is the perl script 'note' in version 1.4.1 from 05/09/2024. +This is the perl script 'note' in version 1.4.2 from 24/09/2024. ## Introduction diff --git a/VERSION b/VERSION index 347f583..9df886c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.1 +1.4.2 diff --git a/bin/note b/bin/note index ad46cd6..fb2de4c 100755 --- a/bin/note +++ b/bin/note @@ -73,12 +73,12 @@ my ( $opt_, $opt_i, $opt_r, $opt_e, $opt_d, $opt_enc, $opt_s, $opt_t, $opt_T, $opt_l, $opt_L, $opt_c, $opt_D, $opt_I, $opt_o, $opt_h, $opt_n, $opt_v, - $opt_j, + $opt_j, $opt_new, # # set from commandline (or interactive) # - $number, $searchstring, $dump_file, $ImportType, $NewType, $Raw, $TOPIC, + $number, $searchstring, $dump_file, $ImportType, $StdinMode, $Raw, $TOPIC, # # configuration options @@ -145,7 +145,7 @@ $hardparams = "(readonly|maxlen|dbdriver|useencryption|cryptmethod)"; $CONF = File::Spec->catfile($ENV{HOME}, ".noterc"); $USER = getlogin || getpwuid($<); chomp $USER; $TOPIC = 1; -$VERSION = "1.4.1"; +$VERSION = "1.4.2"; $CurDepth = 1; # the current depth inside the topic "directory" structure... $maxlen = "auto"; $timelen = 22; @@ -200,7 +200,7 @@ if ($ARGV[0] eq "") { } elsif ($#ARGV == 0 && $ARGV[0] eq "-") { $mode = "new"; - $NewType = 1; # read from STDIN until EOF + $StdinMode = 1; # read from STDIN until EOF shift; undef $has_nothing; } @@ -210,6 +210,7 @@ else { "interactive|i!" => \$opt_i, # no arg "config|c=s" => \$opt_c, # string, required "raw|r!" => \$opt_r, # no arg + "new|n:s" => \$opt_new, # no arg or optional string "edit|e=i" => \$opt_e, # integer, required "delete|d=s" => \$opt_d, # integer, required "search|s=s" => \$opt_s, # string, required @@ -224,16 +225,23 @@ else { "help|h|?!" => \$opt_h, # no arg "version|v!" => \$opt_v, # no arg "encrypt=s" => \$opt_enc, # string, required - ); - $opt_n = shift; # after that @ARGV contains eventually - # a note-number - # $opt_ is a single dash, in case of existence! + ); + + # after that @ARGV contains eventually a note-number or a single dash + $opt_n = shift; + # # determine mode # if ($opt_i) { $mode = "interactive"; } + elsif (defined $opt_new) { + $mode = "new"; + if ($opt_new eq "-") { + $StdinMode = 1; # read from STDIN + } + } elsif (defined $opt_l || defined $opt_L) { $mode = "list"; if (defined $opt_l) { @@ -302,7 +310,7 @@ else { } } elsif ($opt_v) { - print "This is note $VERSION by Thomas Linden .\n"; + print "This is note $VERSION by Thomas von Dein .\n"; exit(0); } elsif ($opt_h) { @@ -319,18 +327,23 @@ else { $has_nothing = 1; } } + ### determine generic options - if ($opt_n =~ /^[\d+\-?\,*]+$/) { - # first arg is a digit! - if ($mode eq "") { - $number = $opt_n; - $mode = "display"; - undef $has_nothing; - } - else { - print "mode <$mode> does not take a numerical argument!\n"; - exit(1); - } + if ($opt_n =~ /^\d[\d\-?\,]*$/) { + # first arg is a digit! + if ($mode eq "") { + $number = $opt_n; + $mode = "display"; + undef $has_nothing; + } + else { + print "mode <$mode> does not take a numerical argument!\n"; + exit(1); + } + } + elsif ($opt_n eq "-") { + $StdinMode = 1; # read from STDIN + $mode = "new"; } elsif ($opt_n ne "") { print "Unknown option: $opt_n\n"; @@ -352,7 +365,6 @@ if ($has_nothing && $mode eq "") { &usage; } - # read the configfile. $CONF = $opt_c if($opt_c); # if given by commandline, use this. if (-e $CONF) { @@ -371,8 +383,8 @@ if ($mode eq "encrypt_passwd") { exit; } -# Always interactive? -if ($conf{alwaysinteractive} && $mode ne "dump" && $mode ne "import") { +# Always interactive? with the exception if stdin was requested +if ($conf{alwaysinteractive} && $mode ne "dump" && $mode ne "import" && !$StdinMode && !defined $opt_new) { $mode = "interactive"; } @@ -715,69 +727,75 @@ sub list { sub new { my($TEMP,$editor, $date, $note, $WARN, $c, $line, $num, @topic); if ($conf{readonly}) { - print "readonly\n"; - return; - } - $date = &getdate; - return if $db->lock(); - if ($conf{alwayseditor}) { - $TEMP = &gettemp; - # security! - unlink $TEMP; - # let the user edit it... - $editor = &find_editor; - if ($editor) { - # create the temp file - open NEW, "> $TEMP" or die "Could not write $TEMP: $!\n"; - close NEW; - system "chattr", "+s", $TEMP; # ignore errors, since only on ext2 supported! - system $editor, $TEMP; - } - else { - print "Could not find an editor to use!\n"; - $db->unlock(); - exit(0); - } - # read it in ($note) - $note = ""; - open E, "<$TEMP" or $WARN = 1; - if ($WARN) { - print "...edit process interupted! No note has been saved.\n"; - undef $WARN; - $db->unlock(); + print "readonly\n"; return; - } - $c = 0; - while () { - $note = $note . $_; - } - chomp $note; - close E; - # privacy! - unlink $TEMP; + } + + $date = &getdate; + $note = ""; + $line = ""; + + return if $db->lock(); + + if ($StdinMode) { + # create a new note from STDIN + print STDERR "Reading from STDIN ...\n"; + while () { + $note .= $_; + } + } + elsif ($conf{alwayseditor} && &is_interactive()) { + # read a new note interactively or by using the editor + $TEMP = &gettemp; + # security! + unlink $TEMP; + + # let the user edit it... + $editor = &find_editor; + if ($editor) { + # create the temp file + open NEW, "> $TEMP" or die "Could not write $TEMP: $!\n"; + close NEW; + system "chattr", "+s", $TEMP; # ignore errors, since only on ext2 supported! + system $editor, $TEMP; + } + else { + print "Could not find an editor to use!\n"; + $db->unlock(); + exit(0); + } + + # read it in ($note) + $note = ""; + open E, "<$TEMP" or $WARN = 1; + if ($WARN) { + print "...edit process interupted! No note has been saved.\n"; + undef $WARN; + $db->unlock(); + return; + } + + $c = 0; + while () { + $note = $note . $_; + } + chomp $note; + close E; + + # privacy! + unlink $TEMP; } else { - $note = ""; - $line = ""; - # create a new note - if ($NewType) { - # be silent! read from STDIN until EOF. - while () { - $note .= $_; - } - } - else { print "enter the text of the note, end with a single .\n"; - do - { + do { $line = ; $note = $note . $line; - } until $line eq ".\n"; + } until $line eq ".\n"; # remove the . ! chop $note; chop $note; - } } + # look if the note was empty, so don't store it! if ($note =~ /^\s*$/) { print "...your note was empty and will not be saved.\n"; @@ -1341,6 +1359,9 @@ Options: -c, --config file Use another config file than the default \$HOME/.noterc. + -n, --new + Create a new note entry. + -l, --list [topic] Lists all existing notes. If no topic were specified, it will display a list of all existing topics. See the section TOPICS for @@ -1886,4 +1907,9 @@ sub load_driver { sub ticket { return join "", (map { $randomlist[int(rand($#randomlist))] } (0 .. 10) ); } + +sub is_interactive { + return -t STDIN && -t STDOUT; +} + __END__ diff --git a/note.pod b/note.pod index 7318fbe..30adbbf 100644 --- a/note.pod +++ b/note.pod @@ -32,6 +32,9 @@ by the pwsafe3 backend, which is encrypted by default. Use another config file than the default ~/.noterc. +=item I<-n, --new> + +Create a new note entry. =item I<-l, --list [topic]>