Changeset 692 in tailor


Ignore:
Timestamp:
08/25/05 23:17:26 (8 years ago)
Author:
Robin Farine <robin.farine@…>
Hash name:
20050825211726-9b991-ad1ed58010cf1d452b3244fd06c7a156906285ac
Message:

tla: shared vs separate source and target SCM working directories
'tla' as source SCM handles a shared source and target working directory
in a less efficient and safe manner than the case where they are distinct.
In the shared case, 'tla' has to set aside filesystem entries the target
backend may have added before it applies a changeset and has to restore
them afterwards.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vcpx/tla.py

    r594 r692  
    8080        """ 
    8181 
    82         tempdir = self.__hide_foreign_entries() 
    83         try: 
    84             c = ExternalCommand(cwd=self.basedir, 
    85                                 command=[self.repository.TLA_CMD, "replay"]) 
    86             out, err = c.execute(changeset.revision, stdout=PIPE, stderr=PIPE) 
    87             if not c.exit_status in [0, 1]: 
    88                 raise ChangesetApplicationFailure( 
    89                     "%s returned status %d saying \"%s\"" % 
    90                     (str(c), c.exit_status, err.read())) 
    91             # drop initial line: "* patching for revision ..." 
    92             out.readline() 
    93             conflicts = self.__parse_apply_changeset_output(changeset, out) 
    94         finally: 
    95             if tempdir: 
    96                 self.__restore_foreign_entries(tempdir) 
     82        if self.shared_basedirs: 
     83            tempdir = self.__hide_foreign_entries() 
     84            try: 
     85                conflicts = self.__apply_changeset(changeset) 
     86            finally: 
     87                if tempdir: 
     88                    self.__restore_foreign_entries(tempdir) 
     89        else: 
     90            conflicts = self.__apply_changeset(changeset) 
    9791        return conflicts 
    9892 
     
    10397 
    10498        fqrev = self.__initial_revision(revision) 
    105         tempdir = mkdtemp("", ",,tailor-", self.basedir) 
    106         try: 
    107             c = ExternalCommand(cwd=os.path.join(self.basedir, tempdir), 
    108                                 command=[self.repository.TLA_CMD, "get", 
    109                                          "--no-pristine", fqrev, "t"]) 
    110             out, err = c.execute(stdout=PIPE, stderr=PIPE) 
    111             if c.exit_status: 
    112                 raise TargetInitializationFailure( 
    113                     "%s returned status %d saying \"%s\"" % 
    114                     (str(c), c.exit_status, err.read())) 
    115             newtree = os.path.join(tempdir, "t") 
    116             for e in os.listdir(newtree): 
    117                 os.rename(os.path.join(newtree, e), 
    118                           os.path.join(self.basedir,e)) 
    119         finally: 
    120             try: 
    121                 for root, dirs, files in os.walk(tempdir, topdown=False): 
    122                     for name in files: 
    123                         os.remove(os.path.join(root, name)) 
    124                     for name in dirs: 
    125                         os.rmdir(os.path.join(root, name)) 
     99        if self.shared_basedirs: 
     100            tempdir = mkdtemp("", ",,tailor-", self.basedir) 
     101            try: 
     102                self.__checkout_initial_revision(fqrev, tempdir, "t") 
     103            finally: 
     104                newtree = os.path.join(tempdir, "t") 
     105                if os.path.exists(newtree): 
     106                    for e in os.listdir(newtree): 
     107                        os.rename(os.path.join(newtree, e), 
     108                                  os.path.join(self.basedir, e)) 
     109                    os.rmdir(newtree) 
    126110                os.rmdir(tempdir) 
    127             except: 
    128                 pass 
     111        else: 
     112            root, destdir = os.path.split(self.basedir) 
     113            self.__checkout_initial_revision(fqrev, root, destdir) 
    129114        return self.__parse_revision_logs([fqrev], False)[0] 
    130115 
    131116    ## TlaWorkingDir private helper functions 
     117 
     118    def __checkout_initial_revision(self, fqrev, root, destdir): 
     119        if not os.path.exists(root): 
     120            os.makedirs(root) 
     121        c = ExternalCommand(cwd=root, 
     122                            command=[self.repository.TLA_CMD, "get", 
     123                                     "--no-pristine", fqrev, destdir]) 
     124        out, err = c.execute(stdout=PIPE, stderr=PIPE) 
     125        if c.exit_status: 
     126            raise TargetInitializationFailure( 
     127                "%s returned status %d saying \"%s\"" % 
     128                (str(c), c.exit_status, err.read())) 
     129 
     130    def __apply_changeset(self, changeset): 
     131        c = ExternalCommand(cwd=self.basedir, 
     132                            command=[self.repository.TLA_CMD, "replay"]) 
     133        out, err = c.execute(changeset.revision, stdout=PIPE, stderr=PIPE) 
     134        if not c.exit_status in [0, 1]: 
     135            raise ChangesetApplicationFailure( 
     136                "%s returned status %d saying \"%s\"" % 
     137                (str(c), c.exit_status, err.read())) 
     138        # drop initial line: "* patching for revision ..." 
     139        out.readline() 
     140        return self.__parse_apply_changeset_output(changeset, out) 
    132141 
    133142    def __normalize_path(self, path): 
     
    206215                            command=[self.repository.TLA_CMD, 
    207216                                     "tree-lint", "-tu"]) 
    208         out = c.execute(stdout=PIPE) 
     217        out = c.execute(stdout=PIPE)[0] 
    209218        tempdir = None 
    210219        if c.exit_status: 
Note: See TracChangeset for help on using the changeset viewer.