From: Catalin Marinas <catalin.marinas@gmail.com>
To: git@vger.kernel.org
Cc: "Karl Hasselström" <kha@treskal.com>
Subject: [StGIT PATCH 3/5] Add stack creation and initialisation support to lib.Stack
Date: Fri, 06 Jun 2008 21:45:54 +0100 [thread overview]
Message-ID: <20080606204554.8805.37257.stgit@localhost.localdomain> (raw)
In-Reply-To: <20080606204322.8805.32313.stgit@localhost.localdomain>
This patch adds the create and initialise Stack classmethods to handle
the initialisation of StGIT patch series on a Git branch.
Signed-off-by: Catalin Marinas <catalin.marinas@gmail.com>
---
stgit/lib/stack.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 62 insertions(+), 1 deletions(-)
diff --git a/stgit/lib/stack.py b/stgit/lib/stack.py
index 030c407..9cb3967 100644
--- a/stgit/lib/stack.py
+++ b/stgit/lib/stack.py
@@ -3,6 +3,10 @@
import os.path
from stgit import exception, utils
from stgit.lib import git, stackupgrade
+from stgit.config import config
+
+class StackException(exception.StgException):
+ """Exception raised by L{stack} objects."""
class Patch(object):
"""Represents an StGit patch. This class is mainly concerned with
@@ -105,6 +109,14 @@ class PatchOrder(object):
all = property(lambda self: self.applied + self.unapplied + self.hidden)
all_visible = property(lambda self: self.applied + self.unapplied)
+ @staticmethod
+ def create(stackdir):
+ """Create the PatchOrder specific files
+ """
+ utils.create_empty_file(os.path.join(stackdir, 'applied'))
+ utils.create_empty_file(os.path.join(stackdir, 'unapplied'))
+ utils.create_empty_file(os.path.join(stackdir, 'hidden'))
+
class Patches(object):
"""Creates L{Patch} objects. Makes sure there is only one such object
per patch."""
@@ -140,7 +152,7 @@ class Stack(git.Branch):
self.__patchorder = PatchOrder(self)
self.__patches = Patches(self)
if not stackupgrade.update_to_current_format_version(repository, name):
- raise exception.StgException('%s: branch not initialized' % name)
+ raise StackException('%s: branch not initialized' % name)
patchorder = property(lambda self: self.__patchorder)
patches = property(lambda self: self.__patches)
@property
@@ -158,6 +170,55 @@ class Stack(git.Branch):
return True
return self.head == self.patches.get(self.patchorder.applied[-1]).commit
+ def set_parents(self, remote, branch):
+ if remote:
+ self.set_parent_remote(remote)
+ if branch:
+ self.set_parent_branch(branch)
+
+ @classmethod
+ def initialise(cls, repository, name = None):
+ """Initialise a Git branch to handle patch series.
+
+ @param repository: The L{Repository} where the L{Stack} will be created
+ @param name: The name of the L{Stack}
+ """
+ if not name:
+ name = repository.current_branch_name
+ # make sure that the corresponding Git branch exists
+ git.Branch(repository, name)
+
+ dir = os.path.join(repository.directory, cls.__repo_subdir, name)
+ compat_dir = os.path.join(dir, 'patches')
+ if os.path.exists(dir):
+ raise StackException('%s: branch already initialized' % name)
+
+ # create the stack directory and files
+ utils.create_dirs(dir)
+ utils.create_dirs(compat_dir)
+ PatchOrder.create(dir)
+ config.set(stackupgrade.format_version_key(name),
+ str(stackupgrade.FORMAT_VERSION))
+
+ return repository.get_stack(name)
+
+ @classmethod
+ def create(cls, repository, name,
+ create_at = None, parent_remote = None, parent_branch = None):
+ """Create and initialise a Git branch returning the L{Stack} object.
+
+ @param repository: The L{Repository} where the L{Stack} will be created
+ @param name: The name of the L{Stack}
+ @param create_at: The Git id used as the base for the newly created
+ Git branch
+ @param parent_remote: The name of the remote Git branch
+ @param parent_branch: The name of the parent Git branch
+ """
+ git.Branch.create(repository, name, create_at = create_at)
+ stack = cls.initialise(repository, name)
+ stack.set_parents(parent_remote, parent_branch)
+ return stack
+
class Repository(git.Repository):
"""A git L{Repository<git.Repository>} with some added StGit-specific
operations."""
next prev parent reply other threads:[~2008-06-06 20:47 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-06 20:45 [StGIT PATCH 0/5] Proposed patches Catalin Marinas
2008-06-06 20:45 ` [StGIT PATCH 1/5] Rename Repository.head to Repository.head_ref Catalin Marinas
2008-06-07 9:09 ` Karl Hasselström
2008-06-06 20:45 ` [StGIT PATCH 2/5] Create a git.Branch class as ancestor of stack.Stack Catalin Marinas
2008-06-07 9:16 ` Karl Hasselström
2008-06-06 20:45 ` Catalin Marinas [this message]
2008-06-07 9:30 ` [StGIT PATCH 3/5] Add stack creation and initialisation support to lib.Stack Karl Hasselström
2008-06-08 22:03 ` Catalin Marinas
2008-06-06 20:46 ` [StGIT PATCH 4/5] Convert "init" to the new StGIT infrastructure Catalin Marinas
2008-06-07 9:32 ` Karl Hasselström
2008-06-06 20:46 ` [StGIT PATCH 5/5] Add test_patches target to Makefile Catalin Marinas
2008-06-07 9:42 ` Karl Hasselström
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080606204554.8805.37257.stgit@localhost.localdomain \
--to=catalin.marinas@gmail.com \
--cc=git@vger.kernel.org \
--cc=kha@treskal.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox