On Saturday 10 September 2005 22:41, Jean Delvare wrote:
> Hi all,
>
> I might need to be able to annotate any version of a file, rather than
> its current state, in a near future. So I started hacking the quilt
> annotate command. Now I have working code, so I thought I'd just post it
> here for review and comments. In particular, I would like to know if
> there is a general interest in having this feature added to quilt.
>
> Concretely, I have been adding a -p option to annotate, and when used,
> the annotation loop stops at this patch rather than going on up to the
> top patch. My tests are successful, and I've extended the test suite to
> test this option.

The annotate help text failed to mention that only applied patches will show 
(which I first thought was kind of obvious). So the same effect could also be 
achieved by popping to the right patch. It may still be useful to add the -p 
option, in particular because a patch later on the stack might remove text 
(e.g., move it around), and the information which patches modified that text 
is not contained in the final annotation.

> You'll see a comment about next_patch needing to be computed again -
> that's the point that raised my earlier questions about variables and
> pipes. If anyone can find a more elegant implementation, please speak
> up.

I see now what you were struggling with. In this case I would probably have 
moved the "| @PATCH@ $template" inside the loop, or switched to a tempfile 
for the entire patch. What do you think of the attached version instead 
though? It's almost the same but cleaner.

> Two more notes:
>
> 1* "quilt annotate -p $(quilt top) file" is the same as "quilt annotate
> file", so both commands should always behave the same.

Yes.

> 2* I replaced a call to print_series() by a call to applied_patches() in
                                            ^ cat_series you mean.
> the process (in the case -p isn't used) as it seemed more optimal to me
> that way. If I'm wrong, just let me know. If I'm not, then this change
> can go in even if this patch doesn't.

That's an improvement, yes.

Cheers,
Andreas.
Index: bash_completion
===================================================================
RCS file: /cvsroot/quilt/quilt/bash_completion,v
retrieving revision 1.19
diff -u -r1.19 bash_completion
--- bash_completion	26 Aug 2005 10:20:48 -0000	1.19
+++ bash_completion	11 Sep 2005 01:58:28 -0000
@@ -132,8 +132,15 @@
 	   esac
 	   ;;
 	annotate)
-	   _quilt_comfile 
-	   COMPREPLY=( [EMAIL PROTECTED]:-} $( compgen -W "-h" -- $cur ) )
+	   case $prev in
+	     -p)
+ 	        COMPREPLY=( $( compgen -W "$(quilt applied)" -- $cur ) )
+		;;
+	     *)
+	        _quilt_comfile
+	        COMPREPLY=( [EMAIL PROTECTED]:-} $( compgen -W "-p -h" -- $cur ) )
+	        ;;
+	   esac
 	   ;;
 	applied) 
 	   COMPREPLY=( $( compgen -W "-h $(quilt applied)" -- $cur ) )
Index: quilt/annotate.in
===================================================================
RCS file: /cvsroot/quilt/quilt/quilt/annotate.in,v
retrieving revision 1.5
diff -u -r1.5 annotate.in
--- quilt/annotate.in	18 Jul 2005 10:18:13 -0000	1.5
+++ quilt/annotate.in	11 Sep 2005 01:58:29 -0000
@@ -19,12 +19,15 @@
 
 usage()
 {
-	printf $"Usage: quilt annotate {file}\n"
+	printf $"Usage: quilt [-p patch] annotate {file}\n"
 	if [ x$1 = x-h ]
 	then
 		printf $"
 Print an annotated listing of the specified file showing which
-patches modify which lines.
+patches modify which lines. Only applied patches are included.
+
+-p	Stop checking for changes at the specified rather than the
+	topmost patch.
 "
 		exit 0
 	else
@@ -89,7 +92,7 @@
 	exec 4<&-
 }
 
-options=`getopt -o h -- "$@"`
+options=`getopt -o p:h -- "$@"`
 
 if [ $? -ne 0 ]
 then
@@ -101,6 +104,13 @@
 while true
 do
 	case "$1" in
+	-p)
+		if ! opt_patch=$(find_patch $2)
+		then
+			printf $"Patch %s is not in series\n" "$2" >&2
+			exit 1
+		fi
+		shift 2 ;;
 	-h)
 		usage -h ;;
 	--)
@@ -115,12 +125,24 @@
 fi
 opt_file="$SUBDIR$1"
 
-for patch in $(cat_series); do
+for patch in $(applied_patches); do
 	if [ -f "$(backup_file_name $patch "$opt_file")" ]
 	then
 		[EMAIL PROTECTED]"$patch"
 	fi
+	if [ "$opt_patch" = $patch ]
+	then
+		# We also need to know the next patch, if any
+		next_patch="$(next_patch_for_file "$opt_patch" "$opt_file")"
+		break
+	fi
 done
+if [ -z "$next_patch" ]
+then
+	last_file="$opt_file"
+else
+	last_file="$(backup_file_name $next_patch "$opt_file")"
+fi
 
 if [ [EMAIL PROTECTED] = 0 ]
 then
@@ -148,11 +170,13 @@
 empty_file ${patches[0]} "$opt_file" > $template
 for ((n = 0; n < [EMAIL PROTECTED]; n++))
 do
-	annotation_for "${patches[$n]}" "${patches[$((n+1))]}" "$opt_file" \
+	annotation_for "${patches[$n]}" \
+		       "${patches[$((n+1))]:-$next_patch}" \
+		       "$opt_file" \
 		       $((n+1))
 done \
 | @PATCH@ $template
-merge_files $template "$opt_file"
+merge_files $template "$last_file"
 
 echo
 for ((n = 0; n < [EMAIL PROTECTED]; n++))
Index: test/annotate.test
===================================================================
RCS file: /cvsroot/quilt/quilt/test/annotate.test,v
retrieving revision 1.3
diff -u -r1.3 annotate.test
--- test/annotate.test	9 Sep 2005 18:27:51 -0000	1.3
+++ test/annotate.test	11 Sep 2005 01:58:29 -0000
@@ -62,6 +62,29 @@
 	> 2	patches/patch2
 	> 3	patches/patch3
 
+	$ quilt annotate -p patch3 foo
+	>	foo
+	> 2	baz
+	>
+	> 1	patches/patch
+	> 2	patches/patch2
+	> 3	patches/patch3
+
+	$ quilt annotate -p patch2 foo
+	>	foo
+	> 1	Bar
+	> 2	baz
+	>
+	> 1	patches/patch
+	> 2	patches/patch2
+
+	$ quilt annotate -p patch foo
+	>	foo
+	> 1	Bar
+	> 1	Baz
+	>
+	> 1	patches/patch
+
 	$ quilt new patch4
 	> Patch patches/patch4 is now on top
 
_______________________________________________
Quilt-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/quilt-dev

Reply via email to