Hi,

Josh Boyer asked me to post the CVS support patches I have a few weeks ago.  It took me a while to get rev'ed up to 0.42 (sorry Josh!), but here they are.

This is implemented as a set of "generic" stubs in the quilt code that are overriden with versions which support CVS from a user's quiltrc file.  I say "generic" because I'm sure in practice additional hooks might be needed for some other source control systems (e.g. to do some operation before adding a file, rather than after).

This implementation does source control operations for changes to the patches in the QUILT_PATCHES directory or to the series file, not for files in the working tree.  It dynamically determines if the affected file is in a CVS controlled directory, and does nothing if it is not.

We place the patches and the series file in the QUILT_PATCHES directory, which is symlinked from the working tree to a CVS controlled directory.  The implementation doesn't assume this structure--it just looks to see if the files are in a CVS directory--but this is the only structure I've tested with.

The patches--in the order I apply them--are:
quilt-really_delete.patch
This is the same patch I posted earlier to add options to delete to remove the deleted patch files.  The scm_hooks patch is dependent on this patch because it adds a hook to the delete code.
quilt-realpath.patch
This patch adds patchfns "readlink" and "realpath" for dealing with symbolic links.  The CVS hooks depend on this, but I've also found these useful for other things, so I keep them in a separate patch.
quilt-scm_hooks.patch
This patch implements the generic source control hooks in the quilt code.  The default hooks just return success, so they don't do anything if not overridden by the user.
Finally, there is quiltrc.cvs:
This is not a patch, but shows the functions that can be added to a user's quiltrc file to override the default hooks and add support for CVS.

-- 
Joe Green <[EMAIL PROTECTED]>
MontaVista Software, Inc.


Source: MontaVista Software, Inc. <[EMAIL PROTECTED]>
Type: Enhancement
Disposition: submitted to http://savannah.nongnu.org/projects/quilt

Add options to the delete command that will remove the deleted patch from
the QUILT_PATCHES directory and optionally create a backup file.

Index: quilt-0.42/quilt/delete.in
===================================================================
--- quilt-0.42.orig/quilt/delete.in
+++ quilt-0.42/quilt/delete.in
@@ -19,7 +19,7 @@ fi
 
 usage()
 {
-	printf $"Usage: quilt delete [patch | -n]\n"
+	printf $"Usage: quilt delete [-r] [--backup] [patch | -n]\n"
 	if [ x$1 = x-h ]
 	then
 		printf $"
@@ -29,6 +29,12 @@ topmost patch can be removed right now.)
 
 -n	Delete the next patch after topmost, rather than the specified
 	or topmost patch.
+
+-r	Remove the deleted patch file from the patches directory as well.
+
+--backup
+	Rename the patch file to patch~ rather than deleting it.
+	Ignored if not used with \"-r\".
 "
 
 		exit 0
@@ -37,7 +43,7 @@ topmost patch can be removed right now.)
 	fi
 }
 
-options=`getopt -o nh -- "$@"`
+options=`getopt -o nrh --long backup -- "$@"`
 
 if [ $? -ne 0 ]
 then
@@ -52,8 +58,14 @@ do
 	-n)
 		opt_next=1
 		shift ;;
+	-r)
+		opt_remove=1
+		shift ;;
 	-h)
 		usage -h ;;
+	--backup)
+		QUILT_BACKUP=1
+		shift ;;
 	--)
 		shift
 		break ;;
@@ -113,6 +125,28 @@ then
 	printf $"Removed patch %s\n" "$(print_patch "$patch")"
 else
 	printf $"Failed to remove patch %s\n" "$(print_patch "$patch")" >&2
+	exit 1
+fi
+
+patch_file=$(patch_file_name "$patch")
+if [ "$opt_remove" -a -e "$patch_file" ]
+then
+	if [ "$QUILT_BACKUP" ]
+	then
+		if ! mv -f "$patch_file" "$patch_file~"
+		then
+			printf $"Failed to backup patch file \"%s\"\n" \
+				"$patch_file" >&2
+			exit 1
+		fi
+	else
+		if ! rm -f "$patch_file"
+		then
+			printf $"Failed to remove patch file \"%s\"\n" \
+				"$patch_file" >&2
+			exit 1
+		fi
+	fi
 fi
 ### Local Variables:
 ### mode: shell-script
Index: quilt-0.42/bash_completion
===================================================================
--- quilt-0.42.orig/bash_completion
+++ quilt-0.42/bash_completion
@@ -139,7 +139,7 @@ _quilt_completion()
 	   COMPREPLY=( $( compgen -W "-h $(quilt applied)" -- $cur ) )
 	   ;;
 	delete) 
-	   COMPREPLY=( $( compgen -W "-n -h $(quilt series)" -- $cur ) )
+	   COMPREPLY=( $( compgen -W "-n -r -h --backup $(quilt series)" -- $cur ) )
 	   ;;
 	diff) 
 	   case $prev in
Source: MontaVista Software, Inc. <[EMAIL PROTECTED]>
Type: Enhancement
Disposition: submit to http://savannah.nongnu.org/projects/quilt

Add "readlink" and "realpath" functions for following symlinks.

Index: quilt-0.42/scripts/patchfns.in
===================================================================
--- quilt-0.42.orig/scripts/patchfns.in
+++ quilt-0.42/scripts/patchfns.in
@@ -125,6 +125,29 @@ dirname()
 	echo "${path:-.}"
 }
 
+if ! type readlink &> /dev/null ; then
+readlink()
+{
+	expr "$(/bin/ls -ld $1)" : ".*-> \(.*\)$"
+}
+fi
+
+# If input file names a symbolic link, print path to real file.
+# If non-existent or not a link, print the input path.
+realpath()
+{
+	local path="$1"
+	while [ -L "$path" ] ; do
+		local link=$(readlink "$path")
+		if [ "${link#/}" = "$link" ] ; then
+			path=$(dirname "$path")"/$link"
+		else
+			path="$link"
+		fi
+	done
+	echo "$path"
+}
+
 patch_file_name()
 {
 	echo "$QUILT_PATCHES/$1"
Source: MontaVista Software, Inc. ([EMAIL PROTECTED])
Type: Enhancement
Disposition: submit to http://savannah.nongnu.org/projects/quilt

Add hooks for Sofware Configuration Management systems.  These have
been tested with CVS hooks.

Index: quilt-0.42/quilt/import.in
===================================================================
--- quilt-0.42.orig/quilt/import.in
+++ quilt-0.42/quilt/import.in
@@ -104,10 +104,13 @@ do
 		fi
 		printf $"Replacing patch %s with new version\n" \
 		       "$(print_patch $patch)" >&2
+		scm_modify_patch "edit" "$QUILT_PATCHES/$patch" || exit 1
+		newpatch=no
 	else
 		printf $"Importing patch %s (stored as %s)\n" \
 		       "$(print_patch $patch_file)" \
 		       "$(print_patch $patch)"
+		newpatch=yes
 	fi
 	dest=$QUILT_PATCHES/$patch
 	mkdir -p "${dest%/*}"
@@ -117,6 +120,11 @@ do
 		status=1
 	fi
 
+	if [ "$newpatch" = "yes" ]
+	then
+		scm_modify_patch "add" "$QUILT_PATCHES/$patch" || exit 1
+	fi
+
 	if ! patch_in_series $patch &&
 	   ! insert_in_series $patch "$patch_args"
 	then
Index: quilt-0.42/scripts/patchfns.in
===================================================================
--- quilt-0.42.orig/scripts/patchfns.in
+++ quilt-0.42/scripts/patchfns.in
@@ -40,6 +40,35 @@ fi
 
 # ========================================================
 
+if [ "$(type -t scm_modify_patch)" != function ]
+then
+	# Overridable hook to enable source control for patch files.
+	scm_modify_patch()
+	{
+		# local op="$1" patch_file="$2"
+		# op is one of:
+		#   "add"       add patch_file to source control
+		#   "edit"      enable modification to existing patch_file
+		#   "delete"    remove patch_file from source control
+		return 0
+	}
+fi
+
+if [ "$(type -t scm_modify_series)" != function ]
+then
+	# Overridable hook to enable source control for series file.
+	scm_modify_series()
+	{
+		# local op="$1" series_file="$2"
+		# op is one of:
+		#   "add"       add series_file to source control
+		#   "edit"      enable modification to existing series_file
+		return 0
+	}
+fi
+
+# ========================================================
+
 #declare -a exit_handlers
 #
 #add_exit_handler() {
@@ -167,6 +196,11 @@ change_db_strip_level()
 		' $SERIES > $tmpfile
 		if ! cmp $SERIES $tmpfile >/dev/null 2>/dev/null
 		then
+			if ! scm_modify_series "edit" "$SERIES"
+			then
+				rm -f $tmpfile
+				return 1
+			fi
 			cat $tmpfile > $SERIES
 		fi
 		rm -f $tmpfile
@@ -192,6 +226,7 @@ insert_in_series()
 {
 	local patch=$1 patch_args=$2
 	local top=$(top_patch) tmpfile
+	local new_series=no
 
 	if [ -n "$patch_args" ]
 	then
@@ -227,8 +262,24 @@ insert_in_series()
 	else
 		echo "$patch$patch_args" > $tmpfile
 	fi
+
+	[ -e "$SERIES" ] || new_series=yes
+
+	if [ "$new_series" = "no" ] && ! scm_modify_series "edit" "$SERIES"
+	then
+		rm -f $tmpfile
+		return 1
+	fi
+
 	cat $tmpfile > $SERIES
 	rm -f $tmpfile
+
+	if [ "$new_series" = "yes" ]
+	then
+		scm_modify_series "add" "$SERIES" || return 1
+	fi
+
+	return 0
 }
 
 remove_from_series()
@@ -240,7 +291,7 @@ remove_from_series()
 	! /^'"$(quote_re $patch)"'([ \t]|$)/ \
 				{ print }
 	' $SERIES > $tmpfile
-	if [ $? -ne 0 ]
+	if [ $? -ne 0 ] || ! scm_modify_series "edit" "$SERIES"
 	then
 		rm -f $tmpfile
 	   	return 1
@@ -261,7 +312,7 @@ rename_in_series()
 		{ print }
 	END	{ exit(! good) }
 	' $SERIES > $tmpfile
-	if [ $? -ne 0 ]
+	if [ $? -ne 0 ] || ! scm_modify_series "edit" "$SERIES"
 	then
 		rm -f $tmpfile
 		return 1
Index: quilt-0.42/quilt/delete.in
===================================================================
--- quilt-0.42.orig/quilt/delete.in
+++ quilt-0.42/quilt/delete.in
@@ -146,6 +146,7 @@ then
 			exit 1
 		fi
 	fi
+	scm_modify_patch "delete" "$patch_file" || exit 1
 fi
 ### Local Variables:
 ### mode: shell-script
Index: quilt-0.42/quilt/fork.in
===================================================================
--- quilt-0.42.orig/quilt/fork.in
+++ quilt-0.42/quilt/fork.in
@@ -118,6 +118,13 @@ printf $"Fork of patch %s created as %s\
        "$(print_patch $top_patch)" \
        "$(print_patch $new_patch)"
 
+patch_file=$(patch_file_name "$new_patch")
+if [ -e "$patch_file" ]
+then
+	scm_modify_patch "add" "$patch_file" || exit 1
+fi
+
+exit 0
 ### Local Variables:
 ### mode: shell-script
 ### End:
Index: quilt-0.42/quilt/refresh.in
===================================================================
--- quilt-0.42.orig/quilt/refresh.in
+++ quilt-0.42/quilt/refresh.in
@@ -290,6 +290,14 @@ fi
 
 cat $tmp_patch >> $tmp_result
 
+if [ -e "$patch_file" ]
+then
+	scm_modify_patch "edit" "$patch_file" || die 1
+	newpatch=no
+else
+	newpatch=yes
+fi
+
 if [ -e $patch_file ] && \
    @DIFF@ -q $patch_file $tmp_result > /dev/null
 then
@@ -305,6 +313,11 @@ fi
 
 touch $QUILT_PC/$patch/.timestamp
 
+if [ "$newpatch" = "yes" ]
+then
+	scm_modify_patch "add" "$patch_file" || die 1
+fi
+
 rm -f $QUILT_PC/$patch~refresh
 if ! change_db_strip_level -p$opt_strip_level $patch
 then
Index: quilt-0.42/quilt/header.in
===================================================================
--- quilt-0.42.orig/quilt/header.in
+++ quilt-0.42/quilt/header.in
@@ -186,7 +186,11 @@ then
 	| maybe_strip_trailing_whitespace
 else
 	patch_file_or_null=/dev/null
-	[ -e "$patch_file" ] && patch_file_or_null=$patch_file
+	if [ -e "$patch_file" ]
+	then
+		patch_file_or_null=$patch_file
+		scm_modify_patch "edit" "$patch_file"
+	fi
 
 	tmp=$(gen_tempfile) || exit 1
 	tmp2=$(gen_tempfile) || exit 1
@@ -244,6 +248,11 @@ $"Replaced header of patch %s\n" "$(prin
 			printf \
 $"Appended text to header of patch %s\n" "$(print_patch $patch)"
 		fi
+
+		if [ "$patch_file_or_null" = "/dev/null" ]
+		then
+			scm_modify_patch "add" "$patch_file"
+		fi
 	else
 		exit 1
 	fi
Index: quilt-0.42/quilt/rename.in
===================================================================
--- quilt-0.42.orig/quilt/rename.in
+++ quilt-0.42/quilt/rename.in
@@ -40,6 +40,8 @@ move_file()
 
 	[ -d "$newdir" ] || mkdir -p "$newdir" || return 1
 	mv "$old" "$new" || return 1
+	scm_modify_patch "add" "$new" || return 1
+	scm_modify_patch "delete" "$old" || return 1
 	rmdir -p "$(dirname "$old")" 2> /dev/null
 
 	return 0
cvs_operation()
{
        local op="$1" dir=$(dirname "$2") name=$(basename "$2")

        if [ -d "$dir/CVS" ]
        then
                case "$op" in
                add)
                        # Add file to source control
                        if ! (cd "$dir" && cvs -Q add -ko "$name")
                        then
                                printf $"CVS add failed for file \"%s\".\n" \
                                        "$dir/$name" >&2
                                return 1
                        fi
                        ;;
                edit)
                        # Enable modification to existing file
                        if [ ! -w "$dir/$name" ] &&
                            ! (cd "$dir" && cvs edit "$name")
                        then
                                printf $"CVS edit failed for file \"%s\".\n" \
                                        "$dir/$name" >&2
                                return 1
                        fi
                        ;;
                delete)
                        # Remove file from source control
                        if ! (cd "$dir" && cvs -Q remove "$name") ; then
                                printf $"CVS remove failed for file \"%s\".\n" \
                                        "$dir/$name" >&2
                                return 1
                        fi
                        ;;
                esac
        fi
        return 0
}

scm_modify_patch()
{
        cvs_operation "$1" "$2"
}

scm_modify_series()
{
        cvs_operation "$1" "$(realpath $2)"
}
_______________________________________________
Quilt-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/quilt-dev

Reply via email to