File: VcsMapResource.cpp

package info (click to toggle)
darkradiant 3.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 41,080 kB
  • sloc: cpp: 264,743; ansic: 10,659; python: 1,852; xml: 1,650; sh: 92; makefile: 21
file content (80 lines) | stat: -rw-r--r-- 1,996 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "VcsMapResource.h"

#include "i18n.h"
#include "iversioncontrol.h"
#include "VersionControlLib.h"
#include "stream/VcsMapResourceStream.h"
#include "os/fs.h"
#include "gamelib.h"
#include <fmt/format.h>

namespace map
{

VcsMapResource::VcsMapResource(const std::string& mapFileUri) :
    MapResource(vcs::getVcsFilePath(mapFileUri)),
    _mapFileUri(mapFileUri)
{
    assert(vcs::pathIsVcsUri(_mapFileUri));

    auto prefix = vcs::getVcsPrefix(_mapFileUri);
    _vcsModule = GlobalVersionControlManager().getModuleForPrefix(prefix);

    if (!_vcsModule)
    {
        rWarning() << "Unrecognised VCS URI prefix: " << prefix << std::endl;
    }

    auto infoFilePath = vcs::getVcsFilePath(_mapFileUri);
    infoFilePath = os::replaceExtension(infoFilePath, game::current::getInfoFileExtension());

    _infoFileUri = vcs::constructVcsFileUri(prefix, vcs::getVcsRevision(_mapFileUri), infoFilePath);
}

bool VcsMapResource::load()
{
    auto result = MapResource::load();

    if (result)
    {
        // Set the name string to contain the revision of the map
        auto mapName = fmt::format("{0}@{1}", os::getFilename(vcs::getVcsFilePath(_mapFileUri)), 
            vcs::getVcsRevision(_mapFileUri).substr(0, 7));
        getRootNode()->setName(mapName);
    }

    return result;
}

bool VcsMapResource::isReadOnly()
{
    return true;
}

void VcsMapResource::save(const MapFormatPtr&)
{
    assert(false);
    rError() << "VcsMapResources cannot be saved." << std::endl;
}

stream::MapResourceStream::Ptr VcsMapResource::openMapfileStream()
{
    return openFileFromVcs(_mapFileUri);
}

stream::MapResourceStream::Ptr VcsMapResource::openInfofileStream()
{
    return openFileFromVcs(_infoFileUri);
}

stream::MapResourceStream::Ptr VcsMapResource::openFileFromVcs(const std::string& uri)
{
    if (!_vcsModule || !vcs::pathIsVcsUri(uri))
    {
        return stream::MapResourceStream::Ptr();
    }

    return stream::VcsMapResourceStream::OpenFromVcs(*_vcsModule, uri);
}

}