git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 6/7] Add "--patch" option to git-add--interactive

From
Wincent Colaiuta <win@wincent.com>
Date
Nov 23, 2007, 19:20 UTC
Message-ID
<1195845650-85962-7-git-send-email-win@wincent.com>
In-Reply-To
<1195845650-85962-6-git-send-email-win@wincent.com>

When the "--patch" option is supplied, the patch_update_file function is called, once for each supplied pathspec argument, and then we exit.

This commit adds an early return mechanism to the patch_update_pathspec function to prevent spurious line feeds from being echoed when the user passes in pathspecs which match unchanged files.

Signed-off-by: Wincent Colaiuta <win@wincent.com>
---
 git-add--interactive.perl |   35 ++++++++++++++++++++++++++++++++---
 1 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 8706528..43a5344 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -1,6 +1,10 @@
 #!/usr/bin/perl -w
 
 use strict;
+use Getopt::Long;
+
+# command line options
+my $patch;
 
 sub run_cmd_pipe {
 	if ($^O eq 'MSWin32') {
@@ -335,7 +339,8 @@ sub add_untracked_cmd {
 
 sub parse_diff {
 	my ($path) = @_;
-	my @diff = run_cmd_pipe(qw(git diff-files -p --), $path);
+	my @diff = run_cmd_pipe(qw(git diff-files -p --), $path)
+	    or return undef;
 	my (@hunk) = { TEXT => [] };
 
 	for (@diff) {
@@ -571,6 +576,7 @@ sub patch_update_pathspec {
 	my ($ix, $num);
 	my $path = shift;
 	my ($head, @hunk) = parse_diff($path);
+	return unless $head;
 	for (@{$head->{TEXT}}) {
 		print;
 	}
@@ -781,6 +787,19 @@ sub check_args {
 	    --error-unmatch --with-tree=HEAD --), @ARGV);
 }
 
+sub usage {
+	print <<EOT;
+git-add--interactive [options] [--] [<filepattern>...]
+Options:
+     -p, --patch        Execute the "patch" subcommand and exit
+EOT
+	exit(1);
+}
+
+sub process_options {
+	GetOptions("patch!" => \$patch) or usage();
+}
+
 sub main_loop {
 	my @cmd = ([ 'status', \&status_cmd, ],
 		   [ 'update', \&update_cmd, ],
@@ -809,7 +828,17 @@ sub main_loop {
 	}
 }
 
+process_options();
 refresh();
 check_args();
-status_cmd();
-main_loop();
+if ($patch) {
+	print "No filepattern specified: what did you want to patch?\n"
+	    unless @ARGV;
+	foreach my $pathspec (@ARGV) {
+		patch_update_pathspec($pathspec);
+	}
+}
+else {
+	status_cmd();
+	main_loop();
+}
-- 
1.5.3.6.886.g3364
Previous: Wincent ColaiutaNext: Wincent Colaiuta
Message 7 of 18 in “git-add--interactive pathspec and patch additions”
  1. git-add--interactive pathspec and patch additionsWincent Colaiuta, Nov 23, 2007
  2. 1/7 Add -q/--quiet switch to git-ls-filesWincent Colaiuta, Nov 23, 2007
  3. 2/7 Rename patch_update_file function to patch_update_pathspecWincent Colaiuta, Nov 23, 2007
  4. 3/7 Add path-limiting to git-add--interactiveWincent Colaiuta, Nov 23, 2007
  5. 4/7 Bail if user supplies an invalid pathspecWincent Colaiuta, Nov 23, 2007
  6. 5/7 Teach builtin-add to pass path arguments to git-add--interactiveWincent Colaiuta, Nov 23, 2007
  7. 6/7 Add "--patch" option to git-add--interactiveWincent Colaiuta, Nov 23, 2007
  8. 7/7 Teach builtin-add to handle "--patch" optionWincent Colaiuta, Nov 23, 2007
  9. Wincent ColaiutaNov 23, 2007
  10. Junio C HamanoNov 23, 2007
  11. Wincent ColaiutaNov 23, 2007
  12. 0/3 Updates to git-add--interactiveWincent Colaiuta, Nov 24, 2007
  13. 1/3 Rename patch_update_file function to patch_update_pathspecWincent Colaiuta, Nov 24, 2007
  14. 2/3 Move pathspec validation into interactive_addWincent Colaiuta, Nov 24, 2007
  15. 3/3 Add "--patch" option to git-add--interactiveWincent Colaiuta, Nov 24, 2007
  16. Junio C HamanoNov 24, 2007
  17. Wincent ColaiutaNov 24, 2007
  18. Junio C HamanoNov 24, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.