# # # add_file "src/model/CertList.cpp" # content [2e39df6bfe9544ac5ac0b66e8adc75eb319f0be7] # # add_file "src/model/CertList.h" # content [e3dc9f3e1a0d8f64e069a2dfaa3a3b661337c596] # # add_file "src/monotone/MonotoneHandle.cpp" # content [ad8ecb421caa5b58372865949f76c956b326707d] # # add_file "src/monotone/MonotoneHandle.h" # content [bd2012e7f3e4d0a01b5278769a3f5b2a3f286c15] # # add_file "src/view/dialogs/ServerDialogManager.cpp" # content [1220d22709e882f2745861adfc8d7408189b00e5] # # add_file "src/view/dialogs/ServerDialogManager.h" # content [7cec8953b0e2e9e65adeed91c4fadf141bbccca6] # # add_file "src/view/mainwindows/ServerWindow.cpp" # content [cba3ef1f19831c59332d58d68f7c14457497218d] # # add_file "src/view/mainwindows/ServerWindow.h" # content [7887daf2f323b16802f47ee94d495955e927bdd5] # # add_file "src/view/widgets/ServerMenuBar.cpp" # content [6f89a96a6a448cd8cd18987593027a2e60e65209] # # add_file "src/view/widgets/ServerMenuBar.h" # content [6acd250edce0886ff7bb98e71366b74dfaecb58c] # # patch "res/forms/dialogs/open_prompt.ui" # from [13dfa418269f3bd5244fcac23ba8098a26720c70] # to [d03d1fa4d28bec1f2eae963e36f3e11e4049482e] # # patch "sources.pri" # from [2f08c68c82081c23e985389beb9dac6e6eb6fc21] # to [cefb814a1688136f1b9e3c5d966a1caa44412cf7] # # patch "src/GuitoneStandalone.cpp" # from [c18d92182a40b7dd4d82476a3a8b69ce36d285c9] # to [a0119c50ce85d5ae9f1c4ce9fea53a98175ecf0b] # # patch "src/GuitoneStandalone.h" # from [e24ee0655b5718a925a1a738c362237275b25e4f] # to [130bd2a5ace20673b853b0f49aa7164dff882c84] # # patch "src/model/Ancestors.cpp" # from [be26e96549d5f55721c5513d9f16e53ecf2e06e6] # to [4d612bcbc7d6e21b18460bbb1231c1e9703c1430] # # patch "src/model/Ancestors.h" # from [d668133dc6751725cdea0a976466e8b8c89f3e3b] # to [de28309cdad6c070ecc311149db702561c02c663] # # patch "src/model/Annotate.cpp" # from [485f71c5f6fbef3233f91987199b8c8ac37793b8] # to [b8c549f28b396f9db085aa2bb0184b2245868100] # # patch "src/model/Annotate.h" # from [6b0eda06cab7acc0b94167e919247155dda40cbc] # to [41a73cd6a6500963cf1f39f76529e6f63822d02b] # # patch "src/model/AutomateCommand.cpp" # from [7f12f375b0834d9bbd1e1a7d901f91b5ad2bcd96] # to [a8f26b6d005071f97cbfbc009e6a5d4093618a90] # # patch "src/model/AutomateCommand.h" # from [5c2be101c4dc2eb361244057112f9f17faf3337e] # to [2377ff679a289185b8dbe06652c3a4a608d056a2] # # patch "src/model/Branches.cpp" # from [9707d8b1361016c41f96729adc0da88b988e51a3] # to [f90b1629937d69ddb9f977c7a605b58b38ad86e0] # # patch "src/model/Branches.h" # from [cf346cdfd0b86ffc8711859f029b44b94c9bc280] # to [6d7691b2efc1bee21a8f916feda26dad9a391ee8] # # patch "src/model/Certs.cpp" # from [3f7a2d60fc0568e08f8206492a792fcddc623c81] # to [ddb47674d6a21355fc5850d58aa0316a08a75c37] # # patch "src/model/Certs.h" # from [d7ec4361924586c6dd6ed83f9259e35fb5b2017e] # to [50f3a40de5f13beacab4d493ea76f048a29c2cb1] # # patch "src/model/ContentDiff.cpp" # from [96601ca8586c28850268b7753a33a36a5e16d8a7] # to [31e19c80a067eee885971a08355a5e421d2a553f] # # patch "src/model/ContentDiff.h" # from [1c6e2ba3401e96ec515c037b068e9ed20f75d652] # to [afa235dfe6a32b2894bc2f8eccbf492a979e366a] # # patch "src/model/GetAttributes.cpp" # from [c48bcbc5d8afbe7f40fc8912eadb631f33371d8b] # to [6bcd1a72894e953a633580e3d2661ff5b9da45ac] # # patch "src/model/GetAttributes.h" # from [4f7ca1ecaf78f12632e3d4a8fa65d670e09020a1] # to [4d3050038724ca2ee7adf28b8c90565511d6c90f] # # patch "src/model/GetBranchLog.cpp" # from [e9ac73db95e5524f1970dbbed89be13c87659baa] # to [81e960481db6bdac38a5ea1de91c111ad2b54af0] # # patch "src/model/GetBranchLog.h" # from [fb34c7f1a38c677e60b4945456567b104922e82e] # to [5cb47c8223ddac917701fcc9bb1c6fd154d9f805] # # patch "src/model/GetContentChanged.cpp" # from [f07066aea6bb76e5c9ff7a28ad51836a3685dced] # to [948ac2596110523f4fa6dc469890b500a26e07a8] # # patch "src/model/GetContentChanged.h" # from [2e459c7beea84cd2cc13c1fed6776eb8101ee361] # to [324c77720fd736b36b72a7d4a8668c945e67a871] # # patch "src/model/GetDatabaseVariables.cpp" # from [a64d26ea00b105a85ca5883eabd5f280ddf4dbb0] # to [f8541e19421025e94cdbfc907c511d9fe6a5d91f] # # patch "src/model/GetDatabaseVariables.h" # from [d5c88700402f4dd78230f3ef8a737571950a4d57] # to [05b49f7a8033630e310f5be0b823886591ec896e] # # patch "src/model/GetFile.cpp" # from [91ee4ba6d8884bd32e7d817562c4781a18fdf735] # to [0e0b5d14f6492ddc40e3b2ccc2289e04ca936b19] # # patch "src/model/GetFile.h" # from [079d6a0490ed823f4d9169bfb8a35f107cdc07e2] # to [1dec5b9aaff37beef4494091378aec8672336a4b] # # patch "src/model/GetRevision.cpp" # from [5d84f72f0ba84421c95832c4a7f72c76c859cd70] # to [6659642e8dbc847525d4d6f9d202d0024f09fbf6] # # patch "src/model/GetRevision.h" # from [29813b88948834794c0947f3fe35e6467a3b4dc3] # to [ee6cfcbb07d0ed81adf8c6ed2e3d905fde700336] # # patch "src/model/Inventory.cpp" # from [a052d31df3cd4f5a9f1fc589e5168941c7f913f1] # to [80516d48c7027b0f859980cb5317fe2e6108e823] # # patch "src/model/Inventory.h" # from [705eda6338ef80e953adaaa0b490e06c67a62138] # to [a7e78245359ce90855ef951433a721a04a69d3ad] # # patch "src/model/InventoryModel.cpp" # from [caaee221cd516e21be7b927d8fa672fd1e7ab6c1] # to [d486a1ecb6fc032fb4ed6b30b531a810aa5abcb5] # # patch "src/model/InventoryModel.h" # from [5829fc37eba4c40c1a559109444aa541f7377669] # to [3451e74962ca7944320c5c4a869252cef0d10d32] # # patch "src/model/InventoryWatcher.cpp" # from [5e16d1a0ed098f6450fa5e6bbd3496a3e2d740d8] # to [cd762ac7986f53c901ceb1dde868db357b0a906b] # # patch "src/model/InventoryWatcher.h" # from [ae3f783cea8382a2592f58468a39a76f33b16036] # to [3ebc62636a049b18da9fc6129e49f3c40565a8f3] # # patch "src/model/Keys.cpp" # from [bac22fe33fe8e16f4ab76201d6f9b3cb527942de] # to [15da8facb87e88eeb55da5339dc30926bb3b9637] # # patch "src/model/Keys.h" # from [9f6df7cf905951771dbb4f1cc1a49117a43c2e34] # to [0b3fe7345717ac96ab302f9fb64700a055d8dbb7] # # patch "src/model/Manifest.cpp" # from [e50bdb95dde92c0bf991c0ce2b4eec714854bf4e] # to [7cddb3ed2b22c78bb61ded0db60fc5930b8858a0] # # patch "src/model/Manifest.h" # from [87f96415291d30c53cfe236812da7c0f7e8e9840] # to [b8846bdf746ba7e5fe0552e4b93798c2459add86] # # patch "src/model/Select.cpp" # from [e77b9594f21232a0e6c7396a3fccf4c78f874dfe] # to [ab23f2131e122610ee5caae8fae9b2848068c6d3] # # patch "src/model/Select.h" # from [b8dc238d172c17c51ae3bf80a9cd2b2ad394939d] # to [f8e3dded72724b4498e6285c7e64376ebf929003] # # patch "src/model/Tags.cpp" # from [c9519659ae3b5f5fab35d9d63574e612e424a394] # to [f1a5b77ef3afb07b4a1a350663a7f4f4c81cf288] # # patch "src/model/Tags.h" # from [81fec9954f65235ce921988b55da5039cdd9b9c2] # to [2f66dbca8993e84b8f46f1785508a1545feda434] # # patch "src/model/Toposort.cpp" # from [6decc7b78dd2486c95649a4b5434d7db4b20a242] # to [de8359cc84d1c78b4e58a6fadfeb8e91e58bf53b] # # patch "src/model/Toposort.h" # from [c077c6787ee68374b47d19961df83adf71258ea5] # to [dc4f6694404ea513d6d8a99f06c6d71f24996d6d] # # patch "src/monotone/FileExporter.cpp" # from [4cea02c79f62a4d0b83a192b453be081e3c9c7e6] # to [14560ec9143c92fdfefc321abafefb4385dcedcb] # # patch "src/monotone/FileExporter.h" # from [44a4bb7eb2d4f29f3c958bd41ecaa7588a5993a3] # to [c6c58e54b2858518ff92e8bd476d1127d8065491] # # patch "src/monotone/MonotoneManager.cpp" # from [57056ba7ca863825592a9884f4ac39528521b857] # to [8b63e64f9501773062d8444415188b6727ca300e] # # patch "src/monotone/MonotoneManager.h" # from [4d0a313dd2921a3b223d16683c48c81d177c627e] # to [9a4a725a495b7ba94eca66cad0502641e176f092] # # patch "src/monotone/MonotoneProcess.h" # from [51bdb9f10ae2e07c2e52150a041ad04e5cb31f00] # to [55157714f3c5a8f543178b37308972f51d0d7209] # # patch "src/monotone/MonotoneThread.cpp" # from [54f25692d5b1c89a4bd4ed42783bb4066a2b2e25] # to [9aee9375d154f37a24147ac87d1327806cc2ec46] # # patch "src/monotone/MonotoneThread.h" # from [ffbb03ad32a7f67796baebb2453a8e66a330ac72] # to [e1f2a29a3682050496a8170dfcfa139f99e23b9f] # # patch "src/monotone/MonotoneUtil.cpp" # from [30f5e234eb795caa6bb55747a51036aa5afaa94d] # to [de3e8bbff078c511a63a47bea8a4a1d014b0cb63] # # patch "src/monotone/MonotoneUtil.h" # from [a42494f54155101db9f71a84a32ca3cfb94f2645] # to [9af29c54ee20c9145b5a619daf276c1bd14661fc] # # patch "src/monotone/WorkspaceCommitter.cpp" # from [552526dc9dacf546ad039cbaa2bf03d7609cdc4d] # to [68b4a90293c03e120488357df87e332e46d6cb73] # # patch "src/monotone/WorkspaceCommitter.h" # from [c2507e2154158f9745dfb7743d6bf4b0b9544d17] # to [270854dcaa6e3bd810b62c15acc611fec7886fa4] # # patch "src/monotone/WorkspaceCreator.cpp" # from [e2abf1e85e13092c96106650fb5a29c9d1c040bf] # to [b2920894fe08036209a860d94c524eca56c10f4b] # # patch "src/monotone/WorkspaceCreator.h" # from [fb360d6db113e9ee9e6a7390be170d1e43f20e48] # to [3af419e9c390d01109e07f33f7708c976a4ae765] # # patch "src/view/dialogs/AnnotateFile.cpp" # from [9d9aae6eaa58f6b1f01872500ced7a7097664d49] # to [24eb167f9665d569b034acfa5520f15d9fcd4f59] # # patch "src/view/dialogs/AnnotateFile.h" # from [7f3392e328b31a5daf075dd8f95491d6846ffe57] # to [6676a9a9d44f33d362f0998dcb4d1de9ab642e32] # # patch "src/view/dialogs/ChangesetBrowser.cpp" # from [f117411e2282c972bfbc24d252c498b49dd6cc61] # to [f9ac55614adfd2af499a463e0c5da320905b40ad] # # patch "src/view/dialogs/ChangesetBrowser.h" # from [2af4dcc3a6843e8545d98b7054fb7c9b398e7aaa] # to [3f4d7d1fbc5c51c9150d38e5ec7aa4c6645af8f0] # # patch "src/view/dialogs/CheckoutRevision.cpp" # from [08a5fb3bd73416a58393d9271b0e9f22710805d6] # to [effa35c60c7d2cd8668de010d3ec98544f9b5c23] # # patch "src/view/dialogs/CheckoutRevision.h" # from [643632486232552a5647b6229826ecffae77aa81] # to [d3a32557f6207f720fac706237c2c3ab41fa695f] # # patch "src/view/dialogs/CommitRevision.cpp" # from [cea026866a5a7b92bfe0784e1741d009069f2a25] # to [876a3055bffea87de28896fc8a9034e0314a0369] # # patch "src/view/dialogs/CommitRevision.h" # from [c4debe06e5d659af57f0f7af563c0a3562b433d1] # to [cf9b6fc36738e60a002383c833eef5e60a8ddd9c] # # patch "src/view/dialogs/CreateCert.cpp" # from [ac94b7b337dad8ddffb2ed525df90360bd54e261] # to [281888ab6c2794a51051fd5c1f79affbb4d65f25] # # patch "src/view/dialogs/CreateCert.h" # from [3252da5f64e71bb138f3450c7d9ed48066f9382b] # to [c03f9fd29d66fb7c858c4845fb06506086d1050f] # # patch "src/view/dialogs/CreateDatabase.cpp" # from [3e3252bd4c9fe7b305adc2c3b939eb1210e35202] # to [717f464eba28ebbe024b734c67db6f11727efb02] # # patch "src/view/dialogs/DatabaseDialogManager.cpp" # from [052e2022d9c33fe5a22d8ada9d29dcaa8dc13c4e] # to [735c030a3f05b6e99ab9590c57dc8a1b46d8c2be] # # patch "src/view/dialogs/DatabaseDialogManager.h" # from [6fcc736dab49c005d9e30c7ee5d53978f2d09c83] # to [786df3fcd74a012b44c064eb935b8af2c44d94ad] # # patch "src/view/dialogs/FileDiff.cpp" # from [44fc4a74f158ae9a6d8a5e855521dc7b8527977b] # to [fe8603471cad4cbdc948351faa2a1fff6217f011] # # patch "src/view/dialogs/FileDiff.h" # from [dbb985d3ede28d6077676ddd35927bdfb03347cc] # to [35927e2ed2cfe3e530d8f9b366ed501a58f36f32] # # patch "src/view/dialogs/FileHistory.cpp" # from [39a8761450d502b9479f27973c791e155b35cf54] # to [f96c1c9b8b2bf3878ca25ca19a0e840393add792] # # patch "src/view/dialogs/FileHistory.h" # from [d543deea2159e969268866f3626cedfc441f84b3] # to [749b32ab1e7448ccf8e3efb3d0708cdd52d2c604] # # patch "src/view/dialogs/GenerateKeypair.cpp" # from [12446002b36af694fa6bbbe6f4d1eee11218db59] # to [2b09cca3244f89a8a8b71b53ea5c043fa2f1150c] # # patch "src/view/dialogs/GenerateKeypair.h" # from [2f96e57ae54980f65a2420bcb78e8ae7f03adb2c] # to [30119d4fdcfc15ee7c2a3a14e606022b46efc6b5] # # patch "src/view/dialogs/KeyManagement.cpp" # from [995e2e3ec808f8eae6bdf033f76ca832dbf514e6] # to [e2a0a71a99464a3acf9ea4fdd62f1c4e0b03f5eb] # # patch "src/view/dialogs/KeyManagement.h" # from [b53a2b1f764b2787cb72beaf6694f1904077e8fd] # to [5f8ee2ddc0d199e9f3cfed4a9bf4f6b875e1ca77] # # patch "src/view/dialogs/Netsync.cpp" # from [05beca66608fae00fd596121e46c4ccf9f797d2e] # to [7f89aa2b8477875ec94998e7a49b2ae5054a3d6f] # # patch "src/view/dialogs/Netsync.h" # from [7e44535efac3ff677517b971814725039aea8dfc] # to [60c3bdb65cba46c0f5305f8bf1dc36ac445dd461] # # patch "src/view/dialogs/NewProjectSetup.cpp" # from [b82fc8e9f06b682ebf3d9dcc93ae0ee7eb40d9c1] # to [29884e89698c44e6957de65a002cacf1e2c584a1] # # patch "src/view/dialogs/NewProjectSetup.h" # from [3eb92299feb93434a64e52c833168a16872b389b] # to [a438d90b69a566730ad4a3d9862188b267d7048b] # # patch "src/view/dialogs/OpenPrompt.cpp" # from [74f3450be09bd97a1fe68ad0b2426fb3c2a9781f] # to [f4b707f26ca5b624d17ff5b007d74fba042f8387] # # patch "src/view/dialogs/OpenPrompt.h" # from [8ceff233c41326a951ee86ec30496258ea1759b4] # to [496152432c142d198f9d2d9fbff89caa1729c41c] # # patch "src/view/dialogs/RevisionDiff.cpp" # from [b4083373890e06ab5d2cded332fb1fbebf30a680] # to [c7c804577761f350c26bec42aac456b065dae1fb] # # patch "src/view/dialogs/RevisionDiff.h" # from [b895f3c22dc1e2451ffc60cbff06a6e52c453c79] # to [f251a593ff991f039cfa2ac281cef5c19e285b1d] # # patch "src/view/dialogs/RevisionManifest.cpp" # from [a03fa33d6be6ebe34d9f169e8fda2adc5cc66457] # to [7414a9f682a105a38370ddba876dd259a532a002] # # patch "src/view/dialogs/RevisionManifest.h" # from [b8fbf6ca8df3d1dbbb34cd5832d3c50f8403334b] # to [91d7ee0135363ad5696630f8fe05953ca14eea34] # # patch "src/view/dialogs/SelectRevision.cpp" # from [f9db3a6293905582be8c05cf580a0d2bc37e7608] # to [9dda96104478d3d3b3b9f15c74b8ed4ac06c78e3] # # patch "src/view/dialogs/SelectRevision.h" # from [7b0eb080172fc538ab62dfd6328914f3e584dae8] # to [b1160998f497b55aa6a290fef42c55404db3cf52] # # patch "src/view/dialogs/UnaccountedRenames.cpp" # from [3ccbb05cdd622261afd7e80dcfb0d29452a88aa9] # to [b61c61af418700ff7fb3b7bd199cbfc73a67b065] # # patch "src/view/dialogs/UnaccountedRenames.h" # from [35d7d6bf27df175ff17c1534ee81ae76a0311284] # to [da73f6ccb228250a4fcde5c030543e46fe6256ec] # # patch "src/view/dialogs/UpdateWorkspace.cpp" # from [9c46b834533239597ee91776ec1abfe9cabb422f] # to [1eadfe28917f0207dc0009c16426af3b6a8cb602] # # patch "src/view/dialogs/UpdateWorkspace.h" # from [9be3dd2b3cab3b6769fadf35865e81bd065f4f53] # to [f01bcf1974c3ead9e8ea6edf09a6a0dd9b113267] # # patch "src/view/dialogs/WorkspaceDialogManager.cpp" # from [b0ef246f9747ea8da66a59c6cd236e99028eca0b] # to [77e476287fdaede8cb3f66fb4ae1bf27fa394899] # # patch "src/view/dialogs/WorkspaceDialogManager.h" # from [31e363829c58f3e3e4c3488f158d88e5e13ba8e0] # to [7d9e1d7d0f5afdfd347c07ddce881a92f7a6c237] # # patch "src/view/mainwindows/DatabaseWindow.cpp" # from [2eaeb3de1cdce9efcb4049d3d1ef64f61f5f36bf] # to [1b6f36a8c142ed4ab0f731b13c4c9b707870036d] # # patch "src/view/mainwindows/DatabaseWindow.h" # from [a2174a941fd5af62a44699d2a36bb08c078cbe6c] # to [b8ddd05db7728d9f61015243934b874443793b3d] # # patch "src/view/mainwindows/MainWindow.h" # from [171feaed58e5a75246babdcf40797c188dfb5df0] # to [cc7620bfdf1dc5fa47711d37f3d4229e2c83e5e6] # # patch "src/view/mainwindows/WorkspaceWindow.cpp" # from [6d1c97beb8ef58c1c6567a24c57e6ae267267834] # to [57032c33f3d551f0ea53b66b350f8cb7075f9c27] # # patch "src/view/mainwindows/WorkspaceWindow.h" # from [d707e8956f801c8e6f9b2a6fe8eceb78b61de885] # to [068de7167552a414e2d954d1ff95d920fd5a462e] # # patch "src/view/panels/DatabaseVariables.cpp" # from [a3d0ea6257c7a5f4754b652db1fcde62eea842e7] # to [8e17715d1ae3e68a26f33ffefc03577673ce7d1f] # # patch "src/view/panels/DatabaseVariables.h" # from [18f5901a440cc1179edc722b1c611d1ee92c9068] # to [4b133dedc8498f69a3029de272939505086c97ba] # # patch "src/view/panels/NodeInfo.cpp" # from [427059e0d6bd2dd1a453c6b98918c05a1514d92e] # to [725716d4a5da526c6e59ebffa7382c03fb1706de] # # patch "src/view/panels/NodeInfo.h" # from [d99d10fed6ffaf7817948cac2fda0fa4120326a9] # to [da7bfab77b9e00ce784c8fb3e0b7f6f2a8984554] # # patch "src/vocab.h" # from [45f37ad58d947f6ab3e7b07d314fd62f54c5356c] # to [6d7889ef50ac0ea2b509b5930cddfd2efc118880] # ============================================================ --- src/model/CertList.cpp 2e39df6bfe9544ac5ac0b66e8adc75eb319f0be7 +++ src/model/CertList.cpp 2e39df6bfe9544ac5ac0b66e8adc75eb319f0be7 @@ -0,0 +1,210 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#include "CertList.h" + +QDateTime Cert::dateTimeValue() const +{ + return QDateTime::fromString(value, "yyyy-MM-ddThh:mm:ss"); +} + +QString Cert::plainValue() const +{ + return QString(value).replace(QRegExp("\\s+"), " "); +} + +QString Cert::htmlValue() const +{ + QString val(value); + QStringList lines = val.replace("<", "<").split(QRegExp("(\\r\\n|\\n|\\n\\r)")); + QString htmlValue; + bool inList = false; + foreach (const QString & line, lines) + { + if (line.isEmpty()) + { + if (inList) + { + htmlValue += "\n\n"; + inList = false; + continue; + } + + htmlValue += "
\n"; + continue; + } + bool listStart = (0 == line.indexOf(QRegExp("^[*-]"))); + if (listStart) + { + if (inList) + { + htmlValue += "\n"; + } + else + { + inList = true; + htmlValue += "\n"; + } + return htmlValue + .replace(QRegExp("(\\b)([_])(\\w+)\\2"), "\\1\\2\\3\\2") + .replace(QRegExp("(\\b)([*])(\\w+)\\2"), "\\1\\2\\3\\2") + .replace(QRegExp("(https?://[^() ]+)"), "\\1") + .replace(QRegExp("\\t"), "    "); +} + +void CertList::add(const Cert & c) +{ + certs.push_back(c); +} + +int CertList::size() const +{ + return certs.size(); +} + +Cert CertList::at(int pos) const +{ + return certs.at(pos); +} + +void CertList::clear() +{ + certs.clear(); + revision = QString(); +} + +QStringList CertList::signers() const +{ + QStringList signers; + foreach (const Cert & cert, certs) + { + if (!signers.contains(cert.key)) + signers.push_back(cert.key); + } + return signers; +} + +QList CertList::findBySigner(const QString & key = QString()) const +{ + QList foundCerts; + foreach (const Cert & cert, certs) + { + if (key.isEmpty() || key == cert.key) + foundCerts.push_back(cert); + } + return foundCerts; +} + +QList CertList::findByName(const QString & name, + const QString & key = QString()) const +{ + QList foundCerts; + foreach (const Cert & cert, findBySigner(key)) + { + if (cert.name != name) + continue; + foundCerts.push_back(cert); + } + return foundCerts; +} + +QStringList CertList::findByNameValues(const QString & name, + const QString & key = QString()) const +{ + QStringList values; + QList certs = findByName(name, key); + foreach (const Cert & cert, certs) + { + values.push_back(cert.value); + } + return values; +} + +void CertList::fill(const StanzaList & stanzas) +{ + foreach (const Stanza & st, stanzas) + { + Cert cert; + foreach (const StanzaEntry & entry, st) + { + if (entry.sym == "key") + { + I(!entry.hash.isEmpty()); + cert.key = entry.hash; + continue; + } + if (entry.sym == "name") + { + I(entry.vals.size() == 1); + cert.name = entry.vals.at(0); + continue; + } + if (entry.sym == "value") + { + I(entry.vals.size() == 1); + cert.value = entry.vals.at(0).trimmed(); + continue; + } + if (entry.sym == "signature") + { + I(entry.vals.size() == 1); + QString sig = entry.vals.at(0); + if (sig == "ok") + cert.signature = Cert::Ok; + else if (sig == "bad") + cert.signature = Cert::Bad; + else if (sig == "unknown") + cert.signature = Cert::Unknown; + else + W(QString("Unknown cert signature state '%1'.").arg(sig)); + continue; + } + if (entry.sym == "trust") + { + I(entry.vals.size() == 1); + QString trust = entry.vals.at(0); + if (trust == "trusted") + cert.trust = Cert::Trusted; + else if (trust == "untrusted") + cert.trust = Cert::Untrusted; + else + W(QString("Unknown cert trust '%1'.").arg(trust)); + continue; + } + } + if (cert.key.isEmpty()) + continue; + add(cert); + } +} + ============================================================ --- src/model/CertList.h e3dc9f3e1a0d8f64e069a2dfaa3a3b661337c596 +++ src/model/CertList.h e3dc9f3e1a0d8f64e069a2dfaa3a3b661337c596 @@ -0,0 +1,56 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#ifndef CERT_LIST_H +#define CERT_LIST_H + +#include + +struct Cert +{ + enum Trust { Trusted, Untrusted } trust; + enum Signature { Ok, Bad, Unknown } signature; + QString key; + QString name; + QString value; + + QDateTime dateTimeValue() const; + QString plainValue() const; + QString htmlValue() const; +}; + +struct CertList +{ + QString revision; + QList certs; + + void add(const Cert & c); + int size() const; + Cert at(int pos) const; + void clear(); + + QStringList signers() const; + QList findBySigner(const QString & key = QString()) const; + QList findByName(const QString & name, + const QString & key = QString()) const; + QStringList findByNameValues(const QString & name, + const QString & key = QString()) const; + void fill(const StanzaList &); +}; + +#endif ============================================================ --- src/monotone/MonotoneHandle.cpp ad8ecb421caa5b58372865949f76c956b326707d +++ src/monotone/MonotoneHandle.cpp ad8ecb421caa5b58372865949f76c956b326707d @@ -0,0 +1,229 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#include "MonotoneHandle.h" +#include "MonotoneProcess.h" +#include "BasicIOParser.h" + +MonotoneHandle::MonotoneHandle(const QString & d, Type t) : data(d), type(t) {} + +void MonotoneHandle::validateMonotoneHandlePtr(QString & database) +{ + QFile dbfile(database); + if (!dbfile.open(QIODevice::ReadOnly)) + { + throw GuitoneException( + QObject::tr("Could not open database for reading: %1") + .arg(dbfile.errorString()) + ); + } + + if (dbfile.read(15) != QByteArray("SQLite format 3")) + { + dbfile.close(); + throw GuitoneException( + QObject::tr("Database file not an SQLite 3 database") + ); + } + + if (!dbfile.seek(60) || dbfile.read(4) != QByteArray("_MTN")) + { + dbfile.close(); + throw GuitoneException(QObject::tr( + "SQLite database is not a monotone database or a database " + "of an older, unsupported version of monotone" + )); + } + dbfile.close(); +} + +void MonotoneHandle::validateWorkspacePath(QString & workspace, + QString & database) +{ + QDir tempDir(workspace); + I(!tempDir.exists()); + + bool found = false; + do + { + if (tempDir.cd("_MTN")) + { + tempDir.cdUp(); + workspace = tempDir.absolutePath(); + found = true; + break; + } + } + while (!tempDir.isRoot() && tempDir.cdUp()); + + if (!found) + { + throw GuitoneException( + QObject::tr("could not find _MTN directory") + ); + } + + + QFile optionsFile(workspace + "/_MTN/options"); + if (!optionsFile.open(QIODevice::ReadOnly | QIODevice::Text)) + { + throw GuitoneException( + QObject::tr("could not open _MTN/options for reading") + ); + } + + QByteArray contents = optionsFile.readAll(); + optionsFile.close(); + + if (contents.size() == 0) + { + throw GuitoneException(QObject::tr("file _MTN/options is empty")); + } + + BasicIOParser parser(QString::fromUtf8(contents)); + if (!parser.parse()) + { + throw GuitoneException(QObject::tr("could not parse basic_io from _MTN/options")); + } + + StanzaList stanzas = parser.getStanzas(); + I(stanzas.size() == 1); + Stanza st = stanzas.at(0); + + foreach (const StanzaEntry & entry, st) + { + if (entry.sym == "database") + { + I(entry.vals.size() == 1); + database = entry.vals.at(0); + break; + } + } + + if (database.isEmpty()) + { + throw GuitoneException(QObject::tr("could not find database for workspace")); + } +} + +void MonotoneHandle::validateServerConnection(const QString & host) +{ + QStringList hostAndPort = host.split(":"); + if (hostAndPort.size() == 1) + { + hostAndPort.append("4691"); + } + + QTCPSocket sock; + sock.connectToHost(hostAndPort.at(0), hostAndPort.at(1).toUInt()); + sock.waitForConnected(5000); + + if (!sock.isValid()) + { + sock.disconnectFromHost(); + if (sock.state() != QAbstractSocket::UnconnectedState) + sock.waitForDisconnected(); + + throw GuitoneException(QObject::tr( + "Could not connect to '%1':\n%2" + ).arg(pathOrURI).arg(sock.errorString())); + } + + sock.disconnectFromHost(); + if (sock.state() != QAbstractSocket::UnconnectedState) + sock.waitForDisconnected(); +} + +void MonotoneHandle::resolveDatabaseAlias(QString & database) +{ + QRegExp rx("^:([^\\/:]+)$"); + if (rx.indexIn(database)) + { + QString alias = rx.cap(1); + + QString output; + QStringList args; + args << "au" << "lua" + << "get_default_database_locations"; + + if (MonotoneProcess::singleRun(args, QString(), output)) + { + QRegExp rx("\\[\\d+\\] = \"([^\"]+)\";"); + + int pos = 0; + while ((pos = rx.indexIn(str, pos)) != -1) + { + pos += rx.matchedLength(); + QString location = rx.cap(1); + + QFileInfo finfo(location + "/" + alias); + if (finfo.isFile()) + { + database = finfo.canonicalFilePath(); + break; + } + } + } + } +} + +MonotoneHandlePtr MonotoneHandle::create(const QString & pathOrURI) +{ + QString cleanedPathOrURI(pathOrURI.trimmed()); + + if (cleanedPathOrURI.isEmpty()) + { + throw GuitoneException(QObject::tr("Path / URI is empty")); + } + + Type type; + + QRegExp rx("^mtn://([\\w\\-]+(?:\\.[\\w\\-]+)*(?::\\d+)?)$"); + if (rx.indexIn(cleanedPathOrURI)) + { + cleanedPathOrURI = rx.cap(1); + validateServerConnection(cleanedPathOrURI); + + type = server_handle; + } + else + { + QFileInfo finfo(cleanedPathOrURI); + if (finfo.isDir()) + { + cleanedPathOrURI = finfo.canonicalFilePath(); + + QString database; + validateWorkspace(cleanedPathOrURI, database); + resolveDatabaseAlias(database); + validateDatabase(database); + + type = workspace_handle; + } + else + { + resolveDatabaseAlias(cleanedPathOrURI); + validateDatabase(cleanedPathOrURI); + + type = database_handle; + } + } + + return MonotoneHandlePtr(new MonotoneHandle(cleanedPathOrURI, type)); +} + ============================================================ --- src/monotone/MonotoneHandle.h bd2012e7f3e4d0a01b5278769a3f5b2a3f286c15 +++ src/monotone/MonotoneHandle.h bd2012e7f3e4d0a01b5278769a3f5b2a3f286c15 @@ -0,0 +1,43 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#ifndef MONOTONE_HANDLE_H +#define MONOTONE_HANDLE_H + +#include "vocab.h" + +class MonotoneHandle +{ + QString data; + MonotoneHandle(const QString &, Type); + + static void validateWorkspacePath(QString &, QString &); + static void validateMonotoneHandlePtr(const QString &); + static void validateServerConnection(const QString &); + static void resolveDatabaseAlias(QString &); + +public: + enum Type { workspace_handle, database_handle, server_handle } type; + + Type getType() const { return type; } + QString getData() const { return data; } + + static MonotoneHandlePtr create(const QString &); +}; + +#endif ============================================================ --- src/view/dialogs/ServerDialogManager.cpp 1220d22709e882f2745861adfc8d7408189b00e5 +++ src/view/dialogs/ServerDialogManager.cpp 1220d22709e882f2745861adfc8d7408189b00e5 @@ -0,0 +1,390 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#include "ServerDialogManager.h" +#include "vocab.h" + +ServerDialogManager::ServerDialogManager(QWidget * parent) + : DialogManager(parent), changesetBrowser(0), + checkoutRevision(0), fileDiff(0), fileHistory(0), generateKeypair(0), + netsync(0), keyManagement(0), revisionDiff(0), + revisionManifest(0), selectRevision(0), newProjectSetup(0), + annotateFile(0), createCert(0) +{} + +ServerDialogManager::~ServerDialogManager() +{ + cleanup(); +} + +void ServerDialogManager::cleanup() +{ + if (changesetBrowser) { delete changesetBrowser; changesetBrowser = 0; } + if (checkoutRevision) { delete checkoutRevision; checkoutRevision = 0; } + if (fileDiff) { delete fileDiff; fileDiff = 0; } + if (fileHistory) { delete fileHistory; fileHistory = 0; } + if (generateKeypair) { delete generateKeypair; generateKeypair = 0; } + if (netsync) { delete netsync; netsync = 0; } + if (keyManagement) { delete keyManagement; keyManagement = 0; } + if (revisionDiff) { delete revisionDiff; revisionDiff = 0; } + if (revisionManifest) { delete revisionManifest; revisionManifest = 0; } + if (selectRevision) { delete selectRevision; selectRevision = 0; } + if (newProjectSetup) { delete newProjectSetup; newProjectSetup = 0; } + if (annotateFile) { delete annotateFile; annotateFile = 0; } + if (createCert) { delete createCert; createCert = 0; } +} + +void ServerDialogManager::closeAllDialogs() +{ + if (changesetBrowser) changesetBrowser->close(); + if (checkoutRevision) checkoutRevision->close(); + if (fileDiff) fileDiff->close(); + if (fileHistory) fileHistory->close(); + if (generateKeypair) generateKeypair->close(); + if (netsync) netsync->close(); + if (keyManagement) keyManagement->close(); + if (revisionDiff) revisionDiff->close(); + if (revisionManifest) revisionManifest->close(); + if (selectRevision) selectRevision->close(); + if (newProjectSetup) newProjectSetup->close(); + if (annotateFile) annotateFile->close(); + if (createCert) createCert->close(); + + DialogManager::closeAllDialogs(); +} + +void ServerDialogManager::init(const MonotoneHandlePtr & handle) +{ + monotoneHandle = handle; + cleanup(); +} + +void ServerDialogManager::showChangesetBrowser() +{ + if (!changesetBrowser) + { + changesetBrowser = new ChangesetBrowser(parentWidget(), monotoneHandle); + + connect( + changesetBrowser, SIGNAL(certCreated(const QString &, const QString &, + const QString &, const QString &)), + this, SIGNAL(certCreated(const QString &, const QString &, + const QString &, const QString &)) + ); + + connect( + changesetBrowser, SIGNAL(revisionManifest(const QString &)), + this, SLOT(showRevisionManifest(const QString &)) + ); + + connect( + changesetBrowser, SIGNAL(diffRevision(const QString &, const QString &, const QString &)), + this, SLOT(showRevisionDiff(const QString &, const QString &, const QString &)) + ); + + connect( + changesetBrowser, SIGNAL(diffFile(const QString &, const QString &, const QString &)), + this, SLOT(showFileDiff(const QString &, const QString &, const QString &)) + ); + + connect( + changesetBrowser, SIGNAL(annotateFile(const QString &, const QString &)), + this, SLOT(showAnnotation(const QString &, const QString &)) + ); + + connect( + changesetBrowser, SIGNAL(createCert(const QString &, const QString &)), + this, SLOT(showCreateCert(const QString &, const QString &)) + ); + + connect( + this, SIGNAL(certCreated(const QString &, const QString &, + const QString &, const QString &)), + changesetBrowser, SLOT(handleCertCreation(const QString &, const QString &, + const QString &, const QString &)) + ); + } + + changesetBrowser->init(); + + showDialog(changesetBrowser); +} + +void ServerDialogManager::showCheckoutRevision() +{ + if (!checkoutRevision) + { + checkoutRevision = new CheckoutRevision(parentWidget(), monotoneHandle); + + connect( + checkoutRevision, SIGNAL(selectRevisionFromSelector(const QString &)), + this, SLOT(showSelectRevision(const QString &)) + ); + + // delegate this further + connect( + checkoutRevision, SIGNAL(revisionCheckedOut(const QString &)), + this, SIGNAL(revisionCheckedOut(const QString &)) + ); + + connect( + this, SIGNAL(revisionSelected(const QString &)), + checkoutRevision, SLOT(setSelectedRevision(const QString &)) + ); + } + + showDialog(checkoutRevision); +} + +void ServerDialogManager::showFileDiff(const QString & file, const QString & base, const QString & target) +{ + if (!fileDiff) + { + fileDiff = new FileDiff(parentWidget()); + } + + fileDiff->forDatabase(monotoneHandle, file, base, target); + showDialog(fileDiff); +} + +void ServerDialogManager::showFileHistory(const QString & file, const QString & startRevision) +{ + if (!fileHistory) + { + fileHistory = new FileHistory(parentWidget(), monotoneHandle); + + connect( + fileHistory, SIGNAL(fileDiff(const QString &, const QString &, const QString &)), + this, SLOT(showFileDiff(const QString &, const QString &, const QString &)) + ); + } + + fileHistory->readHistory(file, startRevision); + showDialog(fileHistory); +} + +void ServerDialogManager::showGenerateKeypair() +{ + if (!generateKeypair) + { + generateKeypair = new GenerateKeypair(parentWidget(), monotoneHandle); + + connect( + generateKeypair, SIGNAL(keypairGenerated(const QString &)), + this, SIGNAL(keypairGenerated(const QString &)) + ); + } + + showDialog(generateKeypair); +} + +void ServerDialogManager::showNetsync() +{ + if (!netsync) + { + netsync = new Netsync(parentWidget(), monotoneHandle); + } + + netsync->init(); + showDialog(netsync); +} + +void ServerDialogManager::showKeyManagement() +{ + if (!keyManagement) + { + keyManagement = new KeyManagement(parentWidget(), monotoneHandle); + + connect( + keyManagement, SIGNAL(generateKeypair()), + this, SLOT(showGenerateKeypair()) + ); + + connect( + keyManagement, SIGNAL(changeKeyPassword(const QString &)), + this, SLOT(showChangeKeyPassword(const QString &)) + ); + + connect( + this, SIGNAL(keyPasswordChanged(const QString &)), + keyManagement, SLOT(readKeys()) + ); + + connect( + this, SIGNAL(keypairGenerated(const QString &)), + keyManagement, SLOT(readKeys()) + ); + } + + keyManagement->readKeys(); + showDialog(keyManagement); +} + +void ServerDialogManager::showRevisionDiff(const QString & path, const QString & base, const QString & target) +{ + if (!revisionDiff) + { + revisionDiff = new RevisionDiff(parentWidget()); + + connect( + revisionDiff, SIGNAL(fileDiff(const QString &, const QString &, const QString &)), + this, SLOT(showFileDiff(const QString &, const QString &, const QString &)) + ); + } + + revisionDiff->forDatabase(monotoneHandle, path, base, target); + showDialog(revisionDiff); +} + +void ServerDialogManager::showRevisionManifest(const QString & revision) +{ + if (!revisionManifest) + { + revisionManifest = new RevisionManifest(parentWidget(), monotoneHandle); + + connect( + revisionManifest, SIGNAL(fileHistory(const QString &, const QString &)), + this, SLOT(showFileHistory(const QString &, const QString &)) + ); + + connect( + revisionManifest, SIGNAL(annotateFile(const QString &, const QString &)), + this, SLOT(showAnnotation(const QString &, const QString &)) + ); + } + + revisionManifest->readManifest(revision); + showDialog(revisionManifest); +} + +void ServerDialogManager::showSelectRevision() +{ + showSelectRevision(QString()); +} + +void ServerDialogManager::showSelectRevision(const QString & selector) +{ + if (!selectRevision) + { + selectRevision = new SelectRevision(parentWidget(), monotoneHandle); + + connect( + selectRevision, SIGNAL(revisionDiff(const QString &, const QString &, const QString &)), + this, SLOT(showRevisionDiff(const QString &, const QString &, const QString &)) + ); + + connect( + selectRevision, SIGNAL(revisionManifest(const QString &)), + this, SLOT(showRevisionManifest(const QString &)) + ); + + connect( + selectRevision, SIGNAL(revisionSelected(const QString &)), + this, SIGNAL(revisionSelected(const QString &)) + ); + } + + if (selector.size() > 0) + { + selectRevision->queryRevisions(selector); + } + + showDialog(selectRevision); +} + +void ServerDialogManager::showNewProjectSetup() +{ + if (!newProjectSetup) + { + newProjectSetup = new NewProjectSetup(parentWidget(), monotoneHandle); + + // delegate this further + connect( + newProjectSetup, SIGNAL(newProjectCreated(const QString &)), + this, SIGNAL(newProjectCreated(const QString &)) + ); + } + + newProjectSetup->init(); + showDialog(newProjectSetup); +} + +void ServerDialogManager::showAnnotation(const QString & rev, const QString & file) +{ + if (!annotateFile) + { + annotateFile = new AnnotateFile(parentWidget(), monotoneHandle); + + connect( + annotateFile, SIGNAL(selectRevision()), + this, SLOT(showSelectRevision()) + ); + + connect( + this, SIGNAL(revisionSelected(const QString &)), + annotateFile, SLOT(setSelectedRevision(const QString &)) + ); + + connect( + annotateFile, SIGNAL(revisionManifest(const QString &)), + this, SLOT(showRevisionManifest(const QString &)) + ); + + connect( + annotateFile, SIGNAL(revisionDiff(const QString &, const QString &, const QString &)), + this, SLOT(showRevisionDiff(const QString &, const QString &, const QString &)) + ); + + connect( + annotateFile, SIGNAL(fileDiff(const QString &, const QString &, const QString &)), + this, SLOT(showFileDiff(const QString &, const QString &, const QString &)) + ); + } + + annotateFile->read(rev, file); + showDialog(annotateFile); +} + +void ServerDialogManager::showCreateCert(const QString & rev, const QString & certName) +{ + if (!createCert) + { + createCert = new CreateCert(parentWidget(), monotoneHandle); + + connect( + createCert, SIGNAL(selectRevision()), + this, SLOT(showSelectRevision()) + ); + + connect( + this, SIGNAL(revisionSelected(const QString &)), + createCert, SLOT(setSelectedRevision(const QString &)) + ); + + connect( + createCert, SIGNAL(certCreated(const QString &, const QString &, + const QString &, const QString &)), + this, SIGNAL(certCreated(const QString &, const QString &, + const QString &, const QString &)) + ); + } + + createCert->init(rev, certName); + showDialog(createCert); +} + ============================================================ --- src/view/dialogs/ServerDialogManager.h 7cec8953b0e2e9e65adeed91c4fadf141bbccca6 +++ src/view/dialogs/ServerDialogManager.h 7cec8953b0e2e9e65adeed91c4fadf141bbccca6 @@ -0,0 +1,93 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#ifndef SERVER_DIALOG_MANAGER_H +#define SERVER_DIALOG_MANAGER_H + +#include "DialogManager.h" +#include "ChangesetBrowser.h" +#include "CheckoutRevision.h" +#include "FileDiff.h" +#include "FileHistory.h" +#include "GenerateKeypair.h" +#include "Netsync.h" +#include "KeyManagement.h" +#include "RevisionDiff.h" +#include "RevisionManifest.h" +#include "SelectRevision.h" +#include "NewProjectSetup.h" +#include "AnnotateFile.h" +#include "CreateCert.h" + +class ServerDialogManager : public DialogManager +{ + Q_OBJECT +public: + ServerDialogManager(QWidget *); + ~ServerDialogManager(); + + void init(const MonotoneHandlePtr &); + virtual void closeAllDialogs(); + + //! delegated signals +signals: + void revisionSelected(const QString &); + void revisionCheckedOut(const QString &); + void newProjectCreated(const QString &); + void keypairGenerated(const QString &); + void certCreated(const QString &, const QString &, + const QString &, const QString &); + +public slots: + void showChangesetBrowser(); + void showCheckoutRevision(); + virtual void showFileDiff(const QString & file, const QString & base, const QString & target); + void showFileHistory(const QString & file, const QString & startRevision); + void showGenerateKeypair(); + void showNetsync(); + void showNewProjectSetup(); + void showKeyManagement(); + virtual void showRevisionDiff(const QString & path, const QString & base, const QString & target); + void showRevisionManifest(const QString & revision); + void showSelectRevision(); + void showSelectRevision(const QString & selector); + void showAnnotation(const QString &, const QString &); + void showCreateCert(const QString & rev, const QString & certName = QString()); + +protected: + ChangesetBrowser * changesetBrowser; + CheckoutRevision * checkoutRevision; + FileDiff * fileDiff; + FileHistory * fileHistory; + GenerateKeypair * generateKeypair; + Netsync * netsync; + KeyManagement * keyManagement; + RevisionDiff * revisionDiff; + RevisionManifest * revisionManifest; + SelectRevision * selectRevision; + NewProjectSetup * newProjectSetup; + AnnotateFile * annotateFile; + CreateCert * createCert; + +private: + void cleanup(); + + MonotoneHandlePtr monotoneHandle; +}; + +#endif ============================================================ --- src/view/mainwindows/ServerWindow.cpp cba3ef1f19831c59332d58d68f7c14457497218d +++ src/view/mainwindows/ServerWindow.cpp cba3ef1f19831c59332d58d68f7c14457497218d @@ -0,0 +1,122 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#include "ServerWindow.h" +#include "ServerMenuBar.h" +#include "ServerDialogManager.h" +#include "GuitoneCore.h" +#include "Settings.h" + +#include + +ServerWindow::ServerWindow() : MainWindow(), + loadedDbLabel(0), revisionBrowser(0), netsyncDialog(0) +{ + setObjectName("ServerWindow"); +} + +ServerWindow::~ServerWindow() +{ + if (loadedServerLabel) delete loadedServerLabel; + if (revisionBrowser) delete revisionBrowser; + if (netsyncDialog) delete netsyncDialog; +} + +void ServerWindow::init() +{ + if (!menuBar) + { + menuBar = new ServerMenuBar(this); + } + + if (!dialogManager) + { + dialogManager = new ServerDialogManager(this); + } + + connect( + menuBar, SIGNAL(showNetsync()), + dialogManager, SLOT(showNetsync()) + ); + + connect( + menuBar, SIGNAL(showChangesetBrowser()), + dialogManager, SLOT(showChangesetBrowser()) + ); + + MainWindow::init(); +} + +void ServerWindow::setup() +{ + // + // UI stuff + // + QWidget * centralWidget = new QWidget(this); + + QVBoxLayout * vboxLayout = new QVBoxLayout(centralWidget); + QGroupBox *loadedServerGroup = new QGroupBox(tr("Connected to server"), centralWidget); + vboxLayout->addWidget(loadedDbGroup); + + QVBoxLayout * vboxLayout1 = new QVBoxLayout(loadedServerGroup); + loadedServerLabel = new QLabel(tr("not connected"), this); + vboxLayout1->addWidget(loadedServerLabel); + + QGroupBox * actionGroup = new QGroupBox(tr("Actions"), centralWidget); + QVBoxLayout * vboxLayout2 = new QVBoxLayout(actionGroup); + vboxLayout->addWidget(actionGroup); + + QHBoxLayout * hboxLayout = new QHBoxLayout(); + + revisionBrowser = new QPushButton(tr("Revision browser"), actionGroup); + hboxLayout->addWidget(revisionBrowser); + netsyncDialog = new QPushButton(tr("Network synchronisation"), actionGroup); + hboxLayout->addWidget(netsyncDialog); + + vboxLayout2->addLayout(hboxLayout); + + connect( + revisionBrowser, SIGNAL(clicked()), + dialogManager, SLOT(showChangesetBrowser()) + ); + + connect( + netsyncDialog, SIGNAL(clicked()), + dialogManager, SLOT(showNetsync()) + ); + + setCentralWidget(centralWidget); +} + +void ServerWindow::load(const MonotoneHandlePtr & handle) +{ + I(handle->getType() == MonotoneHandle::server_handle); + + APP->manager()->getThread(handle); + + monotoneHandle = handle; + + loadedServerLabel->setText(handle->getData()); + + setWindowTitle( + tr("%1 - server mode - guitone").arg(handle->getData()) + ); + + reinterpret_cast(dialogManager)->init(handle); +} + ============================================================ --- src/view/mainwindows/ServerWindow.h 7887daf2f323b16802f47ee94d495955e927bdd5 +++ src/view/mainwindows/ServerWindow.h 7887daf2f323b16802f47ee94d495955e927bdd5 @@ -0,0 +1,46 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#ifndef SERVERWINDOW_H +#define SERVERWINDOW_H + +#include "vocab.h" +#include "MainWindow.h" + +#include + +class ServerWindow : public MainWindow +{ + Q_OBJECT +public: + ServerWindow(); + virtual ~ServerWindow(); + + virtual void init(); + virtual void setup(); + virtual void load(const MonotoneHandlePtr &); + +protected: + MonotoneHandlePtr monotoneHandle; + + QLabel * loadedServerLabel; + QPushButton * revisionBrowser; + QPushButton * netsyncDialog; +}; + +#endif ============================================================ --- src/view/widgets/ServerMenuBar.cpp 6f89a96a6a448cd8cd18987593027a2e60e65209 +++ src/view/widgets/ServerMenuBar.cpp 6f89a96a6a448cd8cd18987593027a2e60e65209 @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#include "ServerMenuBar.h" + +ServerMenuBar::ServerMenuBar(QWidget * parent) : MenuBar(parent) +{ + // + // The Server menu + // + actionNetsync = new QAction(tr("Network synchronisation"), this); + actionNetsync->setShortcut(tr("F5")); + actionChangeset_browser = new QAction(tr("Changeset browser"), this); + actionChangeset_browser->setShortcut(tr("Ctrl+B")); + + menuServer = new QMenu(tr("Server"), this); + + menuServer->addAction(actionNetsync); + menuServer->addAction(actionChangeset_browser); + + // insert the menu before the Window menu + insertMenu(menuWindow->menuAction(), menuServer); + + connect( + actionNetsync, SIGNAL(triggered()), + this, SIGNAL(showNetsync()) + ); + + connect( + actionChangeset_browser, SIGNAL(triggered()), + this, SIGNAL(showChangesetBrowser()) + ); +} + +ServerMenuBar::~ServerMenuBar() {} + ============================================================ --- src/view/widgets/ServerMenuBar.h 6acd250edce0886ff7bb98e71366b74dfaecb58c +++ src/view/widgets/ServerMenuBar.h 6acd250edce0886ff7bb98e71366b74dfaecb58c @@ -0,0 +1,43 @@ +/*************************************************************************** + * Copyright (C) 2010 by Thomas Keller * + * address@hidden * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#ifndef SERVER_MENU_BAR_H +#define SERVER_MENU_BAR_H + +#include "MenuBar.h" + +class ServerMenuBar : public MenuBar +{ + Q_OBJECT +public: + ServerMenuBar(QWidget *); + ~ServerMenuBar(); + +signals: + void showNetsync(); + void showChangesetBrowser(); + +protected: + QAction * actionNetsync; + QAction * actionChangeset_browser; + + QMenu * menuServer; +}; + +#endif + ============================================================ --- res/forms/dialogs/open_prompt.ui 13dfa418269f3bd5244fcac23ba8098a26720c70 +++ res/forms/dialogs/open_prompt.ui d03d1fa4d28bec1f2eae963e36f3e11e4049482e @@ -1,70 +1,71 @@ - + + OpenPromptDialog - - + + Qt::ApplicationModal - + true - + 0 0 - 560 - 500 + 491 + 517 - - + + 0 0 - + guitone - + ../../../../.designer/backup../../../../.designer/backup - + - - + + Create Database - + - + - - + + 300 0 - + true - + Create a new monotone database as starting point for a new project or to pull changes from other nodes into. - + false - - + + Qt::Horizontal - + 40 20 @@ -73,17 +74,17 @@ new project or to pull changes from othe - - - + + + 0 0 - + Create... - + false @@ -94,43 +95,43 @@ new project or to pull changes from othe - - + + Open Database - + - - + + true - + Opens an existing monotone database to browse revisions, files and metadata. If you like to checkout a new workspace, open a database first and then use -"Checkout revision" in the "Database" menu. +"Checkout revision" in the "Database" menu. - + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - + false - + 5 - + - - + + false - + Recent databases... @@ -138,10 +139,10 @@ If you like to checkout a new workspace, - + Qt::Horizontal - + 20 40 @@ -150,17 +151,17 @@ If you like to checkout a new workspace, - - - + + + 0 0 - + Browse... - + false @@ -171,45 +172,45 @@ If you like to checkout a new workspace, - - + + Open Workspace - + - - + + true - + Opens an existing workspace directory. If you previously checked out a workspace, use this to manage it. - + Qt::AutoText - + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - + false - + 5 - + - - + + false - + Recent workspaces... @@ -217,10 +218,10 @@ If you previously checked out a workspac - + Qt::Horizontal - + 20 40 @@ -229,17 +230,17 @@ If you previously checked out a workspac - - - + + + 0 0 - + Browse... - + false @@ -250,33 +251,108 @@ If you previously checked out a workspac - + + + Connect to Server + + + + + + + true + + + + Connects to a remote server to browse revisions, files and metadata. + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + false + + + 5 + + + + + + + + + false + + + + Recent connections... + + + + + + + + Qt::Horizontal + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + New connection... + + + false + + + + + + + + + + - - + + About - + false - - + + Preferences - + false - + Qt::Horizontal - + 40 20 @@ -285,8 +361,8 @@ If you previously checked out a workspac - - + + Quit @@ -296,7 +372,7 @@ If you previously checked out a workspac - + ============================================================ --- sources.pri 2f08c68c82081c23e985389beb9dac6e6eb6fc21 +++ sources.pri cefb814a1688136f1b9e3c5d966a1caa44412cf7 @@ -17,6 +17,7 @@ HEADERS = src/view/widgets/TreeView.h \ src/view/widgets/MenuBar.h \ src/view/widgets/DatabaseMenuBar.h \ src/view/widgets/WorkspaceMenuBar.h \ + src/view/widgets/ServerMenuBar.h \ src/view/widgets/ToolBox.h \ src/view/widgets/SearchInput.h \ src/view/widgets/SizeableLabel.h \ @@ -25,10 +26,12 @@ HEADERS = src/view/widgets/TreeView.h \ src/view/mainwindows/MainWindow.h \ src/view/mainwindows/WorkspaceWindow.h \ src/view/mainwindows/DatabaseWindow.h \ + src/view/mainwindows/ServerWindow.h \ src/view/dialogs/Dialog.h \ src/view/dialogs/DialogManager.h \ src/view/dialogs/WorkspaceDialogManager.h \ src/view/dialogs/DatabaseDialogManager.h \ + src/view/dialogs/ServerDialogManager.h \ src/view/dialogs/ApplicationUpdate.h \ src/view/dialogs/SelectRevision.h \ src/view/dialogs/UpdateWorkspace.h \ @@ -62,6 +65,7 @@ HEADERS = src/view/widgets/TreeView.h \ src/monotone/WorkspaceCommitter.h \ src/monotone/MonotoneThread.h \ src/monotone/MonotoneManager.h \ + src/monotone/MonotoneHandle.h \ src/monotone/MonotoneUtil.h \ src/monotone/MonotoneProcess.h \ src/monotone/MonotoneResourceFile.h \ @@ -115,6 +119,7 @@ SOURCES += src/view/widgets/TreeView.cpp src/view/widgets/MenuBar.cpp \ src/view/widgets/DatabaseMenuBar.cpp \ src/view/widgets/WorkspaceMenuBar.cpp \ + src/view/widgets/ServerMenuBar.cpp \ src/view/widgets/ToolBox.cpp \ src/view/widgets/SearchInput.cpp \ src/view/widgets/SizeableLabel.cpp \ @@ -123,10 +128,12 @@ SOURCES += src/view/widgets/TreeView.cpp src/view/mainwindows/MainWindow.cpp \ src/view/mainwindows/WorkspaceWindow.cpp \ src/view/mainwindows/DatabaseWindow.cpp \ + src/view/mainwindows/ServerWindow.cpp \ src/view/dialogs/Dialog.cpp \ src/view/dialogs/DialogManager.cpp \ src/view/dialogs/WorkspaceDialogManager.cpp \ src/view/dialogs/DatabaseDialogManager.cpp \ + src/view/dialogs/ServerDialogManager.cpp \ src/view/dialogs/ApplicationUpdate.cpp \ src/view/dialogs/SelectRevision.cpp \ src/view/dialogs/UpdateWorkspace.cpp \ @@ -160,6 +167,7 @@ SOURCES += src/view/widgets/TreeView.cpp src/monotone/WorkspaceCommitter.cpp \ src/monotone/MonotoneThread.cpp \ src/monotone/MonotoneManager.cpp \ + src/monotone/MonotoneHandle.cpp \ src/monotone/MonotoneUtil.cpp \ src/monotone/MonotoneProcess.cpp \ src/monotone/MonotoneResourceFile.cpp \ ============================================================ --- src/GuitoneStandalone.cpp c18d92182a40b7dd4d82476a3a8b69ce36d285c9 +++ src/GuitoneStandalone.cpp a0119c50ce85d5ae9f1c4ce9fea53a98175ecf0b @@ -19,7 +19,7 @@ #include "GuitoneStandalone.h" #include "WorkspaceWindow.h" #include "DatabaseWindow.h" -#include "CreateDatabase.h" +#include "ServerWindow.h" #include "Settings.h" #include @@ -105,6 +105,11 @@ void GuitoneStandalone::loadSomething() ); connect( + openPrompt, SIGNAL(connectToServer(const QString &)), + this, SLOT(connectToServer(const QString &)) + ); + + connect( openPrompt, SIGNAL(quitApp()), this, SLOT(quit()) ); @@ -112,19 +117,19 @@ void GuitoneStandalone::loadSomething() openPrompt->show(); } -bool GuitoneStandalone::tryLoadSomething(const QString & path) +bool GuitoneStandalone::tryLoadSomething(const QString & pathOrURI) { bool loaded = true; try { - loadFromPath(path); + load(pathOrURI); } catch (GuitoneException & e) { - W(QString("loading of '%1' failed: %2").arg(path).arg(e.what())); + W(QString("loading of '%1' failed: %2").arg(pathOrURI).arg(e.what())); loaded = false; } - D(QString("loading of '%1' succeeded").arg(path)); + D(QString("loading of '%1' succeeded").arg(pathOrURI)); return loaded; } @@ -178,40 +183,36 @@ bool GuitoneStandalone::event(QEvent * e return eaten; } -void GuitoneStandalone::loadFromPath(const QString & path) +void GuitoneStandalone::load(const QString & pathOrURI) { QMutexLocker locker(&lock); - QString canonicalPath(path); + MainWindow * wnd = 0; try { - QFileInfo fileInfo(path); - if (!fileInfo.exists()) - throw GuitoneException(tr("Non-existant path '%1'").arg(path)); + MonotoneHandlePtr handle = MonotoneHandle::create(pathOrURI); - canonicalPath = fileInfo.canonicalFilePath(); + switch (handle->getType()) + { + case MonotoneHandle::database_handle: + wnd = new DatabaseWindow(); + Settings::addItemToList("RecentDatabaseList", handle->getData(), 5); + break; + case MonotoneHandle::workspace_handle: + wnd = new WorkspaceWindow(); + Settings::addItemToList("RecentWorkspaceList", handle->getData(), 5); + break; + case MonotoneHandle::server_handle: + wnd = new ServerWindow(); + Settings::addItemToList("RecentServerList", handle->getData(), 5); + break; + default: + I(false); + } - MainWindow * wnd; - - if (fileInfo.isDir()) - wnd = new WorkspaceWindow(); - else if (fileInfo.isFile()) - wnd = new DatabaseWindow(); - else - throw GuitoneException(tr("Path is neither a file nor a directory")); - wnd->init(); + wnd->load(handle); - try - { - wnd->load(canonicalPath); - } - catch (GuitoneException & e) - { - delete wnd; - throw e; - } - openWindows.append(wnd); ensureCascadedWindowPlacement(wnd); wnd->show(); @@ -219,11 +220,12 @@ void GuitoneStandalone::loadFromPath(con triggerUpdateWindowList(); emit updateRecentLists(); } - catch (GuitoneException & e) { - Settings::removeItemFromList("RecentWorkspaceList", canonicalPath); - Settings::removeItemFromList("RecentDatabaseList", canonicalPath); + if (wnd) delete wnd; + Settings::removeItemFromList("RecentWorkspaceList", pathOrURI); + Settings::removeItemFromList("RecentDatabaseList", pathOrURI); + Settings::removeItemFromList("RecentConnectionList", pathOrURI); emit updateRecentLists(); throw e; } @@ -233,7 +235,7 @@ void GuitoneStandalone::loadWorkspace(co { try { - loadFromPath(path); + load(path); } catch (GuitoneException & e) { @@ -261,7 +263,7 @@ void GuitoneStandalone::loadDatabase(con { try { - loadFromPath(path); + load(path); } catch (GuitoneException & e) { @@ -285,6 +287,34 @@ void GuitoneStandalone::loadDatabase(con openPrompt->hide(); } +void GuitoneStandalone::connectToServer(const QString & server) +{ + try + { + load(server); + } + catch (GuitoneException & e) + { + QMessageBox::critical( + NULL, + tr("Failed to connect to server"), + tr("The server connection could not be established:\n%1").arg(e.what()), + QMessageBox::Ok + ); + + if (openPrompt) + { + openPrompt->setEnabled(true); + openPrompt->raise(); + } + + return; + } + + if (openPrompt) + openPrompt->hide(); +} + void GuitoneStandalone::windowClosed(MainWindow * wnd) { QMutexLocker locker(&lock); ============================================================ --- src/GuitoneStandalone.h e24ee0655b5718a925a1a738c362237275b25e4f +++ src/GuitoneStandalone.h 130bd2a5ace20673b853b0f49aa7164dff882c84 @@ -43,6 +43,7 @@ public slots: public slots: void loadWorkspace(const QString &); void loadDatabase(const QString &); + void connectToServer(const QString &); void activateWindow(int); void raiseAllWindows(); @@ -56,7 +57,7 @@ private: private: bool tryLoadSomething(const QString &); - void loadFromPath(const QString &); + void load(const QString &); void triggerUpdateWindowList(); void ensureCascadedWindowPlacement(MainWindow *); bool closeAllWindows(); ============================================================ --- src/model/Ancestors.cpp be26e96549d5f55721c5513d9f16e53ecf2e06e6 +++ src/model/Ancestors.cpp 4d612bcbc7d6e21b18460bbb1231c1e9703c1430 @@ -20,10 +20,10 @@ #include -Ancestors::Ancestors(QObject * parent, const DatabaseFile & db) - : QAbstractItemModel(parent), AutomateCommand(0), databaseFile(db) +Ancestors::Ancestors(QObject * parent, const MonotoneHandlePtr & handle) + : QAbstractItemModel(parent), AutomateCommand(0), monotoneHandle(handle) { - selRevisions = new RevisionList(); + selRevisions = new QStringList(); } Ancestors::~Ancestors() @@ -43,7 +43,7 @@ void Ancestors::readAncestors(const QStr reset(); MonotoneTaskPtr task(new MonotoneTask(QStringList() << "ancestors" << parents)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void Ancestors::processTaskResult(const MonotoneTaskPtr & task) @@ -64,7 +64,7 @@ void Ancestors::processTaskResult(const { selRevisions->clear(); delete selRevisions; - selRevisions = new RevisionList( + selRevisions = new QStringList( task->getDecodedOutput().split('\n', QString::SkipEmptyParts) ); // reset the view ============================================================ --- src/model/Ancestors.h d668133dc6751725cdea0a976466e8b8c89f3e3b +++ src/model/Ancestors.h de28309cdad6c070ecc311149db702561c02c663 @@ -23,13 +23,11 @@ #include -typedef QStringList RevisionList; - class Ancestors : public QAbstractItemModel, public AutomateCommand { Q_OBJECT public: - Ancestors(QObject *, const DatabaseFile &); + Ancestors(QObject *, const MonotoneHandlePtr &); virtual ~Ancestors(); // needed Qt Model methods @@ -50,9 +48,9 @@ private: private: void processTaskResult(const MonotoneTaskPtr &); - RevisionList * selRevisions; + QStringList * selRevisions; bool sorted; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/model/Annotate.cpp 485f71c5f6fbef3233f91987199b8c8ac37793b8 +++ src/model/Annotate.cpp b8c549f28b396f9db085aa2bb0184b2245868100 @@ -100,7 +100,7 @@ Annotate::~Annotate() if (certsModel) delete certsModel; } -void Annotate::readAnnotation(const DatabaseFile & db, +void Annotate::readAnnotation(const MonotoneHandlePtr & handle, const QString & rev, const QString & file) { @@ -112,16 +112,16 @@ void Annotate::readAnnotation(const Data if (certsModel) delete certsModel; - certsModel = new Certs(this, db); + certsModel = new Certs(this, handle); connect( certsModel, SIGNAL(certsRead(const CertList &)), this, SLOT(certsRead(const CertList &)) ); - databaseFile = db; + monotoneHandle = handle; baseRevision = rev; proc->start( - QStringList() << "annotate" << "-d" << db + QStringList() << "annotate" << "-d" << handle << "-r" << rev << "--revs-only" << file ); } @@ -162,7 +162,7 @@ void Annotate::processFinished(int exitC } QStringList sortedRevisions = - MonotoneUtil::topsortRevisions(databaseFile, revisions.toList()); + MonotoneUtil::topsortRevisions(monotoneHandle, revisions.toList()); QColor startColor = QColor(Settings::getString("AnnotationColorOldestRevision")); QColor endColor = QColor(Settings::getString("AnnotationColorNewestRevision")); ============================================================ --- src/model/Annotate.h 6b0eda06cab7acc0b94167e919247155dda40cbc +++ src/model/Annotate.h 41a73cd6a6500963cf1f39f76529e6f63822d02b @@ -66,7 +66,7 @@ public slots: int columnCount(const QModelIndex &) const; public slots: - void readAnnotation(const DatabaseFile &, const QString &, const QString &); + void readAnnotation(const MonotoneHandlePtr &, const QString &, const QString &); void setSelectedRevision(const QString &); QString getSelectedRevision() const; QString getBaseRevision() const; @@ -76,7 +76,7 @@ private: void currentCertList(const CertList &); private: - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; MonotoneProcess * proc; Certs * certsModel; ============================================================ --- src/model/AutomateCommand.cpp 7f12f375b0834d9bbd1e1a7d901f91b5ad2bcd96 +++ src/model/AutomateCommand.cpp a8f26b6d005071f97cbfbc009e6a5d4093618a90 @@ -42,10 +42,11 @@ AutomateCommand::~AutomateCommand() } } -void AutomateCommand::enqueueTask(const MonotoneThreadPtr & thread, const MonotoneTaskPtr & task) +void AutomateCommand::enqueueTask(const MonotoneHandlePtr & handle, const MonotoneTaskPtr & task) { QMutexLocker locker(&lock); + MonotoneThreadPtr thread = APP->manager()->getThread(handle); int threadNumber = thread->getThreadNumber(); // we want to avoid multiple thread connections @@ -80,18 +81,6 @@ void AutomateCommand::enqueueTask(const } -void AutomateCommand::enqueueWorkspaceTask(const WorkspacePath & ws, const MonotoneTaskPtr & task) -{ - MonotoneThreadPtr thread = APP->manager()->getThreadForWorkspace(ws); - enqueueTask(thread, task); -} - -void AutomateCommand::enqueueDatabaseTask(const DatabaseFile & db, const MonotoneTaskPtr & task) -{ - MonotoneThreadPtr thread = APP->manager()->getThreadForDatabase(db); - enqueueTask(thread, task); -} - bool AutomateCommand::hasQueuedCommands() const { int count = 0; ============================================================ --- src/model/AutomateCommand.h 5c2be101c4dc2eb361244057112f9f17faf3337e +++ src/model/AutomateCommand.h 2377ff679a289185b8dbe06652c3a4a608d056a2 @@ -38,14 +38,11 @@ protected: virtual void processTaskResult(const MonotoneTaskPtr &) = 0; virtual void processTaskAbortion(const MonotoneTaskPtr &); virtual void tickerUpdate(const TickerMap &); - void enqueueWorkspaceTask(const WorkspacePath &, const MonotoneTaskPtr &); - void enqueueDatabaseTask(const DatabaseFile &, const MonotoneTaskPtr &); + void enqueueTask(const MonotoneHandlePtr &, const MonotoneTaskPtr &); bool hasQueuedCommands() const; void abortThreads(); private: - void enqueueTask(const MonotoneThreadPtr &, const MonotoneTaskPtr &); - QMutex lock; QList connectedThreads; QMap > queuedCommands; ============================================================ --- src/model/Branches.cpp 9707d8b1361016c41f96729adc0da88b988e51a3 +++ src/model/Branches.cpp f90b1629937d69ddb9f977c7a605b58b38ad86e0 @@ -27,9 +27,9 @@ * 2) we set the full branch name in tree and list mode as data behind * Qt::ToolTipRole */ -Branches::Branches(QObject * parent, const DatabaseFile & db) +Branches::Branches(QObject * parent, const MonotoneHandlePtr & handle) : QStandardItemModel(parent), AutomateCommand(0), - builder(0), databaseFile(db) + builder(0), monotoneHandle(handle) { branchesAsTree = false; suspendedBranches = false; @@ -55,7 +55,7 @@ void Branches::readBranches() QStringList() << "branches", QStringList() << "ignore-suspend-certs" << "" )); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void Branches::processTaskResult(const MonotoneTaskPtr & task) @@ -87,7 +87,7 @@ void Branches::processTaskResult(const M QStringList() << "select" << "h:" + branch, QStringList() << "ignore-suspend-certs" << "" )); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } } else if (cmd == "select") @@ -103,7 +103,7 @@ void Branches::processTaskResult(const M MonotoneTaskPtr task(new MonotoneTask( QStringList() << "certs" << head )); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } } else if (cmd == "certs") ============================================================ --- src/model/Branches.h cf346cdfd0b86ffc8711859f029b44b94c9bc280 +++ src/model/Branches.h 6d7691b2efc1bee21a8f916feda26dad9a391ee8 @@ -30,7 +30,7 @@ public: { Q_OBJECT public: - Branches(QObject *, const DatabaseFile &); + Branches(QObject *, const MonotoneHandlePtr &); ~Branches(); void markBranchSuspended(const QString &); @@ -55,7 +55,7 @@ private: QMap branchItemMap; TreeBuilder * builder; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; QBrush suspendedBranchesBrush; }; ============================================================ --- src/model/Certs.cpp 3f7a2d60fc0568e08f8206492a792fcddc623c81 +++ src/model/Certs.cpp ddb47674d6a21355fc5850d58aa0316a08a75c37 @@ -19,8 +19,8 @@ #include "Certs.h" #include "BasicIOParser.h" -Certs::Certs(QObject * parent, const DatabaseFile & db) - : QAbstractItemModel(parent), AutomateCommand(0), databaseFile(db) +Certs::Certs(QObject * parent, const MonotoneHandlePtr & handle) + : QAbstractItemModel(parent), AutomateCommand(0), monotoneHandle(handle) {} Certs::~Certs() @@ -37,7 +37,7 @@ void Certs::readCerts(const QString & re if (rev.size() == 0) return; MonotoneTaskPtr task(new MonotoneTask(QStringList() << "certs" << rev)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void Certs::processTaskResult(const MonotoneTaskPtr & task) ============================================================ --- src/model/Certs.h d7ec4361924586c6dd6ed83f9259e35fb5b2017e +++ src/model/Certs.h 50f3a40de5f13beacab4d493ea76f048a29c2cb1 @@ -28,7 +28,7 @@ public: { Q_OBJECT public: - Certs(QObject *, const DatabaseFile &); + Certs(QObject *, const MonotoneHandlePtr &); virtual ~Certs(); void clearData(); @@ -53,7 +53,7 @@ private: private: void processTaskResult(const MonotoneTaskPtr &); - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/model/ContentDiff.cpp 96601ca8586c28850268b7753a33a36a5e16d8a7 +++ src/model/ContentDiff.cpp 31e19c80a067eee885971a08355a5e421d2a553f @@ -40,7 +40,7 @@ void ContentDiff::cleanup() lines.clear(); } -void ContentDiff::readDatabaseDiff(const DatabaseFile & db, const QString & fileName, +void ContentDiff::readDatabaseDiff(const MonotoneHandlePtr & handle, const QString & fileName, const QString & base, const QString & target, const QString & enc) { @@ -64,7 +64,7 @@ void ContentDiff::readDatabaseDiff(const // reverse diff) if (Settings::getBool("FixUnwantedReverseDiffs")) { - revs = MonotoneUtil::topsortRevisions(db, revs); + revs = MonotoneUtil::topsortRevisions(handle, revs); } QStringList opts; @@ -74,10 +74,10 @@ void ContentDiff::readDatabaseDiff(const } MonotoneTaskPtr task(new MonotoneTask(cmd, opts)); - AutomateCommand::enqueueDatabaseTask(db, task); + AutomateCommand::enqueueDatabaseTask(handle, task); } -void ContentDiff::readWorkspaceDiff(const WorkspacePath & ws, const QString & fileName, +void ContentDiff::readWorkspaceDiff(const MonotoneHandlePtr & handle, const QString & fileName, const QString & base, const QString & target, const QString & enc) { @@ -109,7 +109,7 @@ void ContentDiff::readWorkspaceDiff(cons // reverse diff) if (revs.size() == 2 && Settings::getBool("FixUnwantedReverseDiffs")) { - revs = MonotoneUtil::topsortRevisions(MonotoneUtil::getDatabaseFile(ws), revs); + revs = MonotoneUtil::topsortRevisions(MonotoneUtil::getMonotoneHandlePtr(handle), revs); } QStringList opts; @@ -119,7 +119,7 @@ void ContentDiff::readWorkspaceDiff(cons } MonotoneTaskPtr task(new MonotoneTask(cmd, opts)); - AutomateCommand::enqueueWorkspaceTask(ws, task); + AutomateCommand::enqueueWorkspaceTask(handle, task); } void ContentDiff::switchOutputEncoding(const QString & enc) ============================================================ --- src/model/ContentDiff.h 1c6e2ba3401e96ec515c037b068e9ed20f75d652 +++ src/model/ContentDiff.h afa235dfe6a32b2894bc2f8eccbf492a979e366a @@ -126,8 +126,8 @@ public slots: } public slots: - void readDatabaseDiff(const DatabaseFile &, const QString &, const QString &, const QString &, const QString & encoding = QString()); - void readWorkspaceDiff(const WorkspacePath &, const QString &, const QString &, const QString &, const QString & encoding = QString()); + void readDatabaseDiff(const MonotoneHandlePtr &, const QString &, const QString &, const QString &, const QString & encoding = QString()); + void readWorkspaceDiff(const MonotoneHandlePtr &, const QString &, const QString &, const QString &, const QString & encoding = QString()); void switchOutputEncoding(const QString &); signals: ============================================================ --- src/model/GetAttributes.cpp c48bcbc5d8afbe7f40fc8912eadb631f33371d8b +++ src/model/GetAttributes.cpp 6bcd1a72894e953a633580e3d2661ff5b9da45ac @@ -24,8 +24,7 @@ GetAttributes::GetAttributes(QObject * p #include GetAttributes::GetAttributes(QObject * parent) - : QAbstractItemModel(parent), AutomateCommand(0), - workspacePath(), itemPath() + : QAbstractItemModel(parent), AutomateCommand(0), itemPath() {} GetAttributes::~GetAttributes() {} @@ -36,14 +35,14 @@ void GetAttributes::revert() itemPath = QString(); reset(); } -void GetAttributes::setWorkspacePath(const WorkspacePath & ws) +void GetAttributes::setMonotoneHandle(const MonotoneHandlePtr & handle) { - workspacePath = ws; + monotoneHandle = handle; } void GetAttributes::readAttributes(const QString & path) { - I(!workspacePath.isEmpty()); + I(!monotoneHandle.isEmpty()); // clear current attributes list attributes.clear(); @@ -59,7 +58,7 @@ void GetAttributes::readAttributes(const itemPath = path; MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_attributes" << itemPath)); - AutomateCommand::enqueueWorkspaceTask(workspacePath, task); + AutomateCommand::enqueueWorkspaceTask(monotoneHandle, task); } void GetAttributes::processTaskResult(const MonotoneTaskPtr & task) @@ -255,7 +254,7 @@ bool GetAttributes::setAttribute(const Q QStringList() << "set_attribute" << itemPath << key << value )); - MonotoneUtil::runSynchronousWorkspaceTask(workspacePath, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); return task->getReturnCode() == 0; } @@ -266,7 +265,7 @@ bool GetAttributes::dropAttribute(const QStringList() << "drop_attribute" << itemPath << key )); - MonotoneUtil::runSynchronousWorkspaceTask(workspacePath, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); return task->getReturnCode() == 0; } @@ -277,7 +276,7 @@ bool GetAttributes::dropAllAttributes() QStringList() << "drop_attribute" << itemPath )); - MonotoneUtil::runSynchronousWorkspaceTask(workspacePath, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); return task->getReturnCode() == 0; } ============================================================ --- src/model/GetAttributes.h 4f7ca1ecaf78f12632e3d4a8fa65d670e09020a1 +++ src/model/GetAttributes.h 4d3050038724ca2ee7adf28b8c90565511d6c90f @@ -53,7 +53,7 @@ public slots: inline bool attributesLoaded() const { return !itemPath.isEmpty(); } public slots: - void setWorkspacePath(const WorkspacePath &); + void setMonotoneHandle(const MonotoneHandlePtr &); void readAttributes(const QString & itemPath = QString()); void revert(); @@ -63,7 +63,7 @@ private: private: void processTaskResult(const MonotoneTaskPtr &); QList attributes; - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; QString itemPath; }; ============================================================ --- src/model/GetBranchLog.cpp e9ac73db95e5524f1970dbbed89be13c87659baa +++ src/model/GetBranchLog.cpp 81e960481db6bdac38a5ea1de91c111ad2b54af0 @@ -26,8 +26,8 @@ const int GetBranchLog::PortionSize = 50 // FIXME: make this configurable eventually const int GetBranchLog::PortionSize = 50; -GetBranchLog::GetBranchLog(QObject * parent, const DatabaseFile & db) - : QAbstractItemModel(parent), AutomateCommand(0), databaseFile(db) +GetBranchLog::GetBranchLog(QObject * parent, const MonotoneHandlePtr & handle) + : QAbstractItemModel(parent), AutomateCommand(0), monotoneHandle(handle) {} GetBranchLog::~GetBranchLog() @@ -57,7 +57,7 @@ void GetBranchLog::invalidateCertCache(c certMap.remove(rev); MonotoneTaskPtr task(new MonotoneTask(QStringList() << "certs" << rev)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } } @@ -103,7 +103,7 @@ void GetBranchLog::readMore(const QStrin if (!nextRevs.contains(currentBranch)) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "select" << "h:" + branch)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } else { @@ -131,7 +131,7 @@ void GetBranchLog::readNext() QString next = nextRevs[currentBranch].takeLast(); MonotoneTaskPtr task(new MonotoneTask(QStringList() << "parents" << next)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void GetBranchLog::stopReading() @@ -199,7 +199,7 @@ void GetBranchLog::processTaskResult(con QStringList() << "ignore-suspend-certs" << "" )); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); return; } @@ -226,7 +226,7 @@ void GetBranchLog::processTaskResult(con if (!certMap.contains(rev)) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "certs" << rev)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } endInsertRows(); @@ -239,7 +239,7 @@ void GetBranchLog::processTaskResult(con args += nextRevs[currentBranch]; MonotoneTaskPtr task(new MonotoneTask(args)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); return; } ============================================================ --- src/model/GetBranchLog.h fb34c7f1a38c677e60b4945456567b104922e82e +++ src/model/GetBranchLog.h 5cb47c8223ddac917701fcc9bb1c6fd154d9f805 @@ -29,7 +29,7 @@ public: { Q_OBJECT public: - GetBranchLog(QObject *, const DatabaseFile &); + GetBranchLog(QObject *, const MonotoneHandlePtr &); ~GetBranchLog(); QString getCurrentBranch() const; @@ -58,7 +58,7 @@ private: void readingStopped(); private: - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; QMap revisionMap; QMap parentMap; QMap certMap; ============================================================ --- src/model/GetContentChanged.cpp f07066aea6bb76e5c9ff7a28ad51836a3685dced +++ src/model/GetContentChanged.cpp 948ac2596110523f4fa6dc469890b500a26e07a8 @@ -22,8 +22,8 @@ #include -GetContentChanged::GetContentChanged(QObject * parent, const DatabaseFile & db) - : QAbstractItemModel(parent), AutomateCommand(0), databaseFile(db) +GetContentChanged::GetContentChanged(QObject * parent, const MonotoneHandlePtr & handle) + : QAbstractItemModel(parent), AutomateCommand(0), monotoneHandle(handle) {} GetContentChanged::~GetContentChanged() @@ -83,21 +83,21 @@ void GetContentChanged::queryContentChan { if (stopReadingChanges) return; MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_content_changed" << rev << path)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void GetContentChanged::queryParents(const QString & rev) { if (stopReadingChanges) return; MonotoneTaskPtr task(new MonotoneTask(QStringList() << "parents" << rev)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void GetContentChanged::queryCorrespondingPath(const QString & rev, const QString & path, const QString & par) { if (stopReadingChanges) return; MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_corresponding_path" << rev << path << par)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void GetContentChanged::processTaskResult(const MonotoneTaskPtr & task) ============================================================ --- src/model/GetContentChanged.h 2e459c7beea84cd2cc13c1fed6776eb8101ee361 +++ src/model/GetContentChanged.h 324c77720fd736b36b72a7d4a8668c945e67a871 @@ -29,7 +29,7 @@ public: { Q_OBJECT public: - GetContentChanged(QObject *, const DatabaseFile &); + GetContentChanged(QObject *, const MonotoneHandlePtr &); virtual ~GetContentChanged(); // needed Qt Model methods @@ -60,7 +60,7 @@ private: void processTaskResult(const MonotoneTaskPtr &); - RevisionList revisions; + QStringList revisions; QQueue revsForPathStack; @@ -69,7 +69,7 @@ private: QString startRev; QString startPath; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; bool stopReadingChanges; }; ============================================================ --- src/model/GetDatabaseVariables.cpp a64d26ea00b105a85ca5883eabd5f280ddf4dbb0 +++ src/model/GetDatabaseVariables.cpp f8541e19421025e94cdbfc907c511d9fe6a5d91f @@ -26,16 +26,17 @@ GetDatabaseVariables::~GetDatabaseVariab GetDatabaseVariables::~GetDatabaseVariables() {} -void GetDatabaseVariables::setDatabaseFile(const DatabaseFile & db) +void GetDatabaseVariables::setMonotoneHandle(const MonotoneHandlePtr & handle) { - databaseFile = db; + monotoneHandle = handle; } void GetDatabaseVariables::readVariables() { - I(!databaseFile.isEmpty()); + I(!monotoneHandle.isNull()); + MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_db_variables")); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void GetDatabaseVariables::processTaskResult(const MonotoneTaskPtr & task) @@ -218,7 +219,7 @@ bool GetDatabaseVariables::setVariable(c QStringList() << "set_db_variable" << domain << key << value )); - MonotoneUtil::runSynchronousDatabaseTask(databaseFile, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); return task->getReturnCode() == 0; } @@ -229,7 +230,7 @@ bool GetDatabaseVariables::dropVariable( QStringList() << "drop_db_variables" << domain << key )); - MonotoneUtil::runSynchronousDatabaseTask(databaseFile, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); return task->getReturnCode() == 0; } ============================================================ --- src/model/GetDatabaseVariables.h d5c88700402f4dd78230f3ef8a737571950a4d57 +++ src/model/GetDatabaseVariables.h 05b49f7a8033630e310f5be0b823886591ec896e @@ -43,7 +43,7 @@ public slots: bool dropVariable(const QString &, const QString &); public slots: - void setDatabaseFile(const DatabaseFile &); + void setMonotoneHandle(const MonotoneHandlePtr &); void readVariables(); signals: @@ -51,7 +51,7 @@ private: private: void processTaskResult(const MonotoneTaskPtr &); - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; // technically we could rewrite the QList> as QMap<...>, // but this structure would be harder to serve the model methods QMap > > variables; ============================================================ --- src/model/GetFile.cpp 91ee4ba6d8884bd32e7d817562c4781a18fdf735 +++ src/model/GetFile.cpp 0e0b5d14f6492ddc40e3b2ccc2289e04ca936b19 @@ -29,7 +29,7 @@ GetFile::~GetFile() {} GetFile::~GetFile() {} -void GetFile::readFileByName(const DatabaseFile & db, const QString & fileName, +void GetFile::readFileByName(const MonotoneHandlePtr & handle, const QString & fileName, const QString & rev, const QString & encoding) { QStringList cmd; @@ -38,19 +38,19 @@ void GetFile::readFileByName(const Datab QStringList opts; opts << "r" << rev; - readFile(db, cmd, opts, encoding); + readFile(handle, cmd, opts, encoding); } -void GetFile::readFileById(const DatabaseFile & db, const QString & fileID, +void GetFile::readFileById(const MonotoneHandlePtr & handle, const QString & fileID, const QString & encoding) { QStringList cmd; cmd << "get_file" << fileID; - readFile(db, cmd, QStringList(), encoding); + readFile(handle, cmd, QStringList(), encoding); } -void GetFile::readFile(const DatabaseFile & db, const QStringList & cmd, +void GetFile::readFile(const MonotoneHandlePtr & handle, const QStringList & cmd, const QStringList & opts, const QString & encoding) { reset(); @@ -61,7 +61,7 @@ void GetFile::readFile(const DatabaseFil task->setOutputEncoding(encoding); } - AutomateCommand::enqueueDatabaseTask(db, task); + AutomateCommand::enqueueDatabaseTask(handle, task); } void GetFile::processTaskResult(const MonotoneTaskPtr & task) ============================================================ --- src/model/GetFile.h 079d6a0490ed823f4d9169bfb8a35f107cdc07e2 +++ src/model/GetFile.h 1dec5b9aaff37beef4494091378aec8672336a4b @@ -58,8 +58,8 @@ public slots: QModelIndex getPrevGroup(const QModelIndex &, bool recurse = false); public slots: - void readFileById(const DatabaseFile &, const QString &, const QString & encoding = QString()); - void readFileByName(const DatabaseFile &, const QString &, const QString &, const QString & encoding = QString()); + void readFileById(const MonotoneHandlePtr &, const QString &, const QString & encoding = QString()); + void readFileByName(const MonotoneHandlePtr &, const QString &, const QString &, const QString & encoding = QString()); void switchOutputEncoding(const QString &); void applyDiff(Diff * diff); @@ -68,7 +68,7 @@ private: void encodingChanged(const QString &); private: - void readFile(const DatabaseFile &, const QStringList &, const QStringList &, const QString & encoding = QString()); + void readFile(const MonotoneHandlePtr &, const QStringList &, const QStringList &, const QString & encoding = QString()); void processTaskResult(const MonotoneTaskPtr &); void loadOutputIntoModel(const QString &); ============================================================ --- src/model/GetRevision.cpp 5d84f72f0ba84421c95832c4a7f72c76c859cd70 +++ src/model/GetRevision.cpp 6659642e8dbc847525d4d6f9d202d0024f09fbf6 @@ -31,14 +31,14 @@ GetRevision::~GetRevision() {} GetRevision::~GetRevision() {} -void GetRevision::readDatabaseRevision(const DatabaseFile & db, const QString & rev) +void GetRevision::readDatabaseRevision(const MonotoneHandlePtr & handle, const QString & rev) { revision.clear(); MonotoneTaskPtr task(new MonotoneTask( QStringList() << "get_revision" << rev)); - AutomateCommand::enqueueDatabaseTask(db, task); + AutomateCommand::enqueueDatabaseTask(handle, task); } -void GetRevision::readWorkspaceRevision(const WorkspacePath & ws, const QStringList & paths) +void GetRevision::readWorkspaceRevision(const MonotoneHandlePtr & handle, const QStringList & paths) { revision.clear(); @@ -50,7 +50,7 @@ void GetRevision::readWorkspaceRevision( } MonotoneTaskPtr task(new MonotoneTask(args)); - AutomateCommand::enqueueWorkspaceTask(ws, task); + AutomateCommand::enqueueWorkspaceTask(handle, task); } void GetRevision::processTaskResult(const MonotoneTaskPtr & task) ============================================================ --- src/model/GetRevision.h 29813b88948834794c0947f3fe35e6467a3b4dc3 +++ src/model/GetRevision.h ee6cfcbb07d0ed81adf8c6ed2e3d905fde700336 @@ -167,8 +167,8 @@ public slots: QStringList getPathsForCompletion() const; public slots: - void readDatabaseRevision(const DatabaseFile &, const QString &); - void readWorkspaceRevision(const WorkspacePath &, const QStringList &); + void readDatabaseRevision(const MonotoneHandlePtr &, const QString &); + void readWorkspaceRevision(const MonotoneHandlePtr &, const QStringList &); void showChangesAgainstParent(const QString &); signals: @@ -180,7 +180,7 @@ private: Revision revision; QString currentParentRevision; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/model/Inventory.cpp a052d31df3cd4f5a9f1fc589e5168941c7f913f1 +++ src/model/Inventory.cpp 80516d48c7027b0f859980cb5317fe2e6108e823 @@ -38,14 +38,14 @@ Inventory::~Inventory() delete rootItem; } -void Inventory::setWorkspacePath(const WorkspacePath & ws) +void Inventory::setMonotoneHandle(const MonotoneHandlePtr & handle) { - workspacePath = ws; + monotoneHandle = handle } void Inventory::read(const QString & path, bool fullQuery) { - I(!workspacePath.isEmpty()); + I(!monotoneHandle.isNull()); QStringList cmd = QStringList() << "inventory"; @@ -72,7 +72,7 @@ void Inventory::read(const QString & pat } MonotoneTaskPtr task(new MonotoneTask(cmd, opts)); - AutomateCommand::enqueueWorkspaceTask(workspacePath, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } /*! @@ -125,7 +125,8 @@ void Inventory::processTaskResult(const QRegExp("restriction includes unknown path") ) && itemMap.contains(queriedPath)) { - if (QFile::exists(workspacePath + "/" + itemMap[queriedPath]->getPath())) + QString workspace = monotoneHandle->getData(); + if (QFile::exists(workspace + "/" + itemMap[queriedPath]->getPath())) { D(QString("keeping existing unknown node %1").arg(queriedPath)); // clear the previous state of the node and its children @@ -194,11 +195,11 @@ void Inventory::processTaskResult(const } else { - QString displayPath = workspacePath; + QString displayPath = monotoneHandle->getData(); QString homePath = QDir::homePath(); - if (workspacePath.indexOf(homePath) == 0) + if (displayPath.indexOf(homePath) == 0) { - displayPath = QDir(homePath).relativeFilePath(workspacePath); + displayPath = QDir(homePath).relativeFilePath(displayPath); displayPath.prepend("~/"); } item->setLabel(displayPath); @@ -375,10 +376,9 @@ QMap Inventory } // TODO: progess bar here! - QString parentRev = MonotoneUtil::getBaseWorkspaceRevision(workspacePath); + QString parentRev = MonotoneUtil::getBaseWorkspaceRevision(monotoneHandle); FileEntryList parentList = MonotoneUtil::getRevisionManifest( - MonotoneUtil::getDatabaseFile(workspacePath), - parentRev + monotoneHandle, parentRev ); QMap unaccountedRenames; @@ -419,8 +419,7 @@ QMap Inventory !fileIds.contains(unknownPath)) { QString fileid = MonotoneUtil::getFileId( - MonotoneUtil::getDatabaseFile(workspacePath), - unknownPath + monotoneHandle, unknownPath ); // file was not readable, etc. if (fileid.isEmpty()) continue; ============================================================ --- src/model/Inventory.h 705eda6338ef80e953adaaa0b490e06c67a62138 +++ src/model/Inventory.h a7e78245359ce90855ef951433a721a04a69d3ad @@ -38,7 +38,7 @@ public slots: static const int QueryLevel; public slots: - void setWorkspacePath(const WorkspacePath &); + void setMonotoneHandle(const MonotoneHandlePtr &); void read(const QString & path = QString(), bool fullQuery = false); private: @@ -48,7 +48,7 @@ private: ModelItem * rootItem; QMap itemMap; - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; signals: void beginInsertRows(ModelItem *, int, int); ============================================================ --- src/model/InventoryModel.cpp caaee221cd516e21be7b927d8fa672fd1e7ab6c1 +++ src/model/InventoryModel.cpp d486a1ecb6fc032fb4ed6b30b531a810aa5abcb5 @@ -66,10 +66,10 @@ InventoryModel::~InventoryModel() delete inventory; } -void InventoryModel::setWorkspacePath(const WorkspacePath & ws) +void InventoryModel::setMonotoneHandle(const MonotoneHandlePtr & handle) { - workspacePath = ws; - inventory->setWorkspacePath(ws); + monotoneHandle = handle; + inventory->setMonotoneHandle(handle); } void InventoryModel::refresh(const QString & path) @@ -445,7 +445,7 @@ void InventoryModel::runWorkspaceCommand void InventoryModel::runWorkspaceCommand(const QStringList & args) { - MonotoneProcess proc(workspacePath); + MonotoneProcess proc(monotoneHandle); proc.start(args); proc.waitForFinished(); @@ -496,7 +496,7 @@ void InventoryModel::renamePath(const QS QStringList args; args << "rename" << oldPath << newPath; - QFileInfo fileInfo(workspacePath + "/" + oldPath); + QFileInfo fileInfo(monotoneHandle + "/" + oldPath); if (!fileInfo.exists()) { args << "--bookkeep-only"; @@ -507,7 +507,7 @@ void InventoryModel::newFile(const QStri void InventoryModel::newFile(const QString & path) { - QFile file(workspacePath + "/" + path); + QFile file(monotoneHandle + "/" + path); if (!file.open(QIODevice::ReadWrite)) { emit workspaceCommandError(tr("Could not create file %1").arg(path)); @@ -520,7 +520,7 @@ void InventoryModel::newDirectory(const void InventoryModel::newDirectory(const QString & path) { - QDir workspace(workspacePath); + QDir workspace(monotoneHandle); if (!workspace.mkpath(path)) { emit workspaceCommandError(tr("Could not create directory %1").arg(path)); @@ -531,7 +531,7 @@ void InventoryModel::ignorePaths(const Q void InventoryModel::ignorePaths(const QStringList & paths) { - QString path(workspacePath); + QString path(monotoneHandle); path.append(QDir::separator()).append(".mtn-ignore"); QFile file(path); @@ -552,7 +552,7 @@ void InventoryModel::unignorePaths(const void InventoryModel::unignorePaths(const QStringList & paths) { - QString path(workspacePath); + QString path(monotoneHandle); path.append(QDir::separator()).append(".mtn-ignore"); QFile file(path); ============================================================ --- src/model/InventoryModel.h 5829fc37eba4c40c1a559109444aa541f7377669 +++ src/model/InventoryModel.h 3451e74962ca7944320c5c4a869252cef0d10d32 @@ -56,7 +56,7 @@ public slots: public slots: //! forwards - void setWorkspacePath(const WorkspacePath &); + void setMonotoneHandle(const MonotoneHandlePtr &); void refresh(const QString & path = QString()); void addPaths(const QStringList &); @@ -73,7 +73,7 @@ private: void runWorkspaceCommand(const QStringList &); Inventory * inventory; - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; QStack nodeInsertions; private slots: ============================================================ --- src/model/InventoryWatcher.cpp 5e16d1a0ed098f6450fa5e6bbd3496a3e2d740d8 +++ src/model/InventoryWatcher.cpp cd762ac7986f53c901ceb1dde868db357b0a906b @@ -50,7 +50,7 @@ InventoryWatcher::~InventoryWatcher() } //! TODO: monitor _MTN/options for changes as well -void InventoryWatcher::setWorkspacePath(const WorkspacePath & wp) +void InventoryWatcher::setMonotoneHandle(const MonotoneHandlePtr & wp) { workspace = wp; QString revPath(workspace + "/_MTN/revision"); ============================================================ --- src/model/InventoryWatcher.h ae3f783cea8382a2592f58468a39a76f33b16036 +++ src/model/InventoryWatcher.h 3ebc62636a049b18da9fc6129e49f3c40565a8f3 @@ -38,7 +38,7 @@ public slots: void changedBaseRevision(const QString &); public slots: - void setWorkspacePath(const WorkspacePath &); + void setMonotoneHandle(const MonotoneHandlePtr &); void watchPaths(const QStringList &); void unwatchPaths(const QStringList &); void clearAllWatches(); @@ -47,7 +47,7 @@ private: void markPathForNotification(const QString &); void checkForBookkeepChanges(); - WorkspacePath workspace; + MonotoneHandlePtr workspace; StanzaList oldRevisionEntries; QStringList changedPaths; QTimer * notifyTimer; ============================================================ --- src/model/Keys.cpp bac22fe33fe8e16f4ab76201d6f9b3cb527942de +++ src/model/Keys.cpp 15da8facb87e88eeb55da5339dc30926bb3b9637 @@ -23,8 +23,8 @@ const int Key::Keystore = 2; const int Key::Database = 1; const int Key::Keystore = 2; -Keys::Keys(QObject * parent, const DatabaseFile & db) - : QAbstractItemModel(parent), AutomateCommand(0), databaseFile(db) +Keys::Keys(QObject * parent, const MonotoneHandlePtr & handle) + : QAbstractItemModel(parent), AutomateCommand(0), monotoneHandle(handle) {} Keys::~Keys() @@ -35,7 +35,7 @@ void Keys::readKeys() void Keys::readKeys() { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "keys")); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void Keys::processTaskResult(const MonotoneTaskPtr & task) ============================================================ --- src/model/Keys.h 9f6df7cf905951771dbb4f1cc1a49117a43c2e34 +++ src/model/Keys.h 0b3fe7345717ac96ab302f9fb64700a055d8dbb7 @@ -39,7 +39,7 @@ public: { Q_OBJECT public: - Keys(QObject *, const DatabaseFile &); + Keys(QObject *, const MonotoneHandlePtr &); virtual ~Keys(); // needed Qt Model methods @@ -62,7 +62,7 @@ private: QString getLocationString(int) const; QString getPasswordSaveStatus(Key *) const; QList keys; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/model/Manifest.cpp e50bdb95dde92c0bf991c0ce2b4eec714854bf4e +++ src/model/Manifest.cpp 7cddb3ed2b22c78bb61ded0db60fc5930b8858a0 @@ -20,8 +20,8 @@ #include "BasicIOParser.h" #include "IconProvider.h" -Manifest::Manifest(QObject * parent, const DatabaseFile & db) - : QAbstractItemModel(parent), AutomateCommand(0), databaseFile(db), root(0) +Manifest::Manifest(QObject * parent, const MonotoneHandlePtr & handle) + : QAbstractItemModel(parent), AutomateCommand(0), monotoneHandle(handle), root(0) {} Manifest::~Manifest() @@ -35,7 +35,7 @@ void Manifest::readManifest(const QStrin reset(); MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_manifest_of" << rev)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void Manifest::processTaskResult(const MonotoneTaskPtr & task) ============================================================ --- src/model/Manifest.h 87f96415291d30c53cfe236812da7c0f7e8e9840 +++ src/model/Manifest.h b8846bdf746ba7e5fe0552e4b93798c2459add86 @@ -67,7 +67,7 @@ public: { Q_OBJECT public: - Manifest(QObject *, const DatabaseFile &); + Manifest(QObject *, const MonotoneHandlePtr &); virtual ~Manifest(); // needed Qt Model methods @@ -87,7 +87,7 @@ private: private: void processTaskResult(const MonotoneTaskPtr &); - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; ManifestEntry * root; }; ============================================================ --- src/model/Select.cpp e77b9594f21232a0e6c7396a3fccf4c78f874dfe +++ src/model/Select.cpp ab23f2131e122610ee5caae8fae9b2848068c6d3 @@ -20,10 +20,10 @@ #include -Select::Select(QObject * parent, const DatabaseFile & db) - : QAbstractItemModel(parent), AutomateCommand(0), databaseFile(db) +Select::Select(QObject * parent, const MonotoneHandlePtr & handle) + : QAbstractItemModel(parent), AutomateCommand(0), monotoneHandle(handle) { - selRevisions = new RevisionList(); + selRevisions = new QStringList(); } Select::~Select() @@ -39,7 +39,7 @@ void Select::readSelection(const QString reset(); MonotoneTaskPtr task(new MonotoneTask(QStringList() << "select" << selector)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void Select::processTaskResult(const MonotoneTaskPtr & task) @@ -60,7 +60,7 @@ void Select::processTaskResult(const Mon } delete selRevisions; - selRevisions = new RevisionList( + selRevisions = new QStringList( task->getDecodedOutput().split('\n', QString::SkipEmptyParts) ); // reset the view ============================================================ --- src/model/Select.h b8dc238d172c17c51ae3bf80a9cd2b2ad394939d +++ src/model/Select.h f8e3dded72724b4498e6285c7e64376ebf929003 @@ -27,7 +27,7 @@ public: { Q_OBJECT public: - Select(QObject *, const DatabaseFile &); + Select(QObject *, const MonotoneHandlePtr &); virtual ~Select(); // needed Qt Model methods @@ -49,9 +49,9 @@ private: private: void processTaskResult(const MonotoneTaskPtr &); - RevisionList * selRevisions; + QStringList * selRevisions; bool sorted; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/model/Tags.cpp c9519659ae3b5f5fab35d9d63574e612e424a394 +++ src/model/Tags.cpp f1a5b77ef3afb07b4a1a350663a7f4f4c81cf288 @@ -19,8 +19,8 @@ #include "Tags.h" #include "BasicIOParser.h" -Tags::Tags(QObject * parent, const DatabaseFile & db) - : QAbstractItemModel(parent), AutomateCommand(0), databaseFile(db) +Tags::Tags(QObject * parent, const MonotoneHandlePtr & handle) + : QAbstractItemModel(parent), AutomateCommand(0), monotoneHandle(handle) { tags = new TagList(); } @@ -41,7 +41,7 @@ void Tags::readTags(const QString & bran } MonotoneTaskPtr task(new MonotoneTask(cmd)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void Tags::processTaskResult(const MonotoneTaskPtr & task) ============================================================ --- src/model/Tags.h 81fec9954f65235ce921988b55da5039cdd9b9c2 +++ src/model/Tags.h 2f66dbca8993e84b8f46f1785508a1545feda434 @@ -36,7 +36,7 @@ public: { Q_OBJECT public: - Tags(QObject *, const DatabaseFile &); + Tags(QObject *, const MonotoneHandlePtr &); virtual ~Tags(); // needed Qt Model methods @@ -57,7 +57,7 @@ private: private: void processTaskResult(const MonotoneTaskPtr &); TagList * tags; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/model/Toposort.cpp 6decc7b78dd2486c95649a4b5434d7db4b20a242 +++ src/model/Toposort.cpp de8359cc84d1c78b4e58a6fadfeb8e91e58bf53b @@ -21,8 +21,8 @@ #include #include -Toposort::Toposort(QObject * parent, const DatabaseFile & db) - : QSortFilterProxyModel(parent), AutomateCommand(0), databaseFile(db), +Toposort::Toposort(QObject * parent, const MonotoneHandlePtr & handle) + : QSortFilterProxyModel(parent), AutomateCommand(0), monotoneHandle(handle), sortColumn(0), sortOrder(Qt::AscendingOrder) { ordRevisions = new RevisionMap(); @@ -112,7 +112,7 @@ void Toposort::sortModel() while (true); MonotoneTaskPtr task(new MonotoneTask(QStringList() << "toposort" << revs)); - AutomateCommand::enqueueDatabaseTask(databaseFile, task); + AutomateCommand::enqueueTask(monotoneHandle, task); } void Toposort::processTaskResult(const MonotoneTaskPtr & task) ============================================================ --- src/model/Toposort.h c077c6787ee68374b47d19961df83adf71258ea5 +++ src/model/Toposort.h dc4f6694404ea513d6d8a99f06c6d71f24996d6d @@ -30,7 +30,7 @@ public: { Q_OBJECT public: - Toposort(QObject *, const DatabaseFile &); + Toposort(QObject *, const MonotoneHandlePtr &); virtual ~Toposort(); void setSourceModel(QAbstractItemModel *); void sort(int, Qt::SortOrder); @@ -44,7 +44,7 @@ private: bool filterAcceptsRow(int, const QModelIndex &) const; RevisionMap * ordRevisions; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; bool showRows; int sortColumn; Qt::SortOrder sortOrder; ============================================================ --- src/monotone/FileExporter.cpp 4cea02c79f62a4d0b83a192b453be081e3c9c7e6 +++ src/monotone/FileExporter.cpp 14560ec9143c92fdfefc321abafefb4385dcedcb @@ -27,8 +27,8 @@ #include "GuitoneCore.h" #include -FileExporter::FileExporter(const DatabaseFile & database, const QString & rev, const QDir & dir) - : QObject(0), databaseFile(database), rootDir(dir), revision(rev) +FileExporter::FileExporter(const MonotoneHandlePtr & database, const QString & rev, const QDir & dir) + : QObject(0), monotoneHandle(database), rootDir(dir), revision(rev) { I(rootDir.exists()); } @@ -86,7 +86,7 @@ bool FileExporter::exportFile(const File QStringList() << "r" << revision )); - MonotoneUtil::runSynchronousDatabaseTask(databaseFile, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); if (!task->isFinished()) F("task aborted"); ============================================================ --- src/monotone/FileExporter.h 44a4bb7eb2d4f29f3c958bd41ecaa7588a5993a3 +++ src/monotone/FileExporter.h c6c58e54b2858518ff92e8bd476d1127d8065491 @@ -27,14 +27,14 @@ public: { Q_OBJECT public: - FileExporter(const DatabaseFile &, const QString &, const QDir &); + FileExporter(const MonotoneHandlePtr &, const QString &, const QDir &); ~FileExporter(); virtual bool run(const FileEntryList &); protected: bool exportFile(const FileEntry &); - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; QDir rootDir; QString revision; }; ============================================================ --- src/monotone/MonotoneManager.cpp 57056ba7ca863825592a9884f4ac39528521b857 +++ src/monotone/MonotoneManager.cpp 8b63e64f9501773062d8444415188b6727ca300e @@ -62,48 +62,8 @@ bool MonotoneManager::setMonotoneBinaryP return true; } -MonotoneThreadPtr MonotoneManager::getThreadForWorkspace(const WorkspacePath & workspace) +MonotoneThreadPtr MonotoneManager::getThread(const MonotoneHandlePtr & handle) { - // ensure that its normalized - WorkspacePath normalizedWorkspace = normalizeWorkspacePath(workspace); - DatabaseFile databaseFile = getDatabaseFilePath(normalizedWorkspace); - return getThread(databaseFile, normalizedWorkspace); -} - -MonotoneThreadPtr MonotoneManager::getThreadForDatabase(const DatabaseFile & database) -{ - if (database.isEmpty()) - { - throw GuitoneException(tr("Database file path is empty")); - } - - QFile dbfile(database); - if (!dbfile.open(QIODevice::ReadOnly)) - { - throw GuitoneException( - tr("Could not open database for reading: %1").arg(dbfile.errorString()) - ); - } - - if (dbfile.read(15) != QByteArray("SQLite format 3")) - { - dbfile.close(); - throw GuitoneException(tr("Database file not an SQLite 3 database")); - } - - if (!dbfile.seek(60) || dbfile.read(4) != QByteArray("_MTN")) - { - dbfile.close(); - throw GuitoneException(tr("SQLite database is not a monotone " - "database or a database of an older, " - "unsupported version of monotone")); - } - dbfile.close(); - return getThread(database, QString()); -} - -MonotoneThreadPtr MonotoneManager::getThread(const DatabaseFile & database, const WorkspacePath & workspace) -{ QMutexLocker locker(&lock); if (mtnPath.isEmpty()) @@ -173,11 +133,11 @@ void MonotoneManager::stopThread(int thr stoppingThreads.insert(threadID); } -void MonotoneManager::stopWorkspaceThreads(const WorkspacePath & workspace) +void MonotoneManager::stopWorkspaceThreads(const MonotoneHandlePtr & workspace) { - WorkspacePath normalizedWorkspace = normalizeWorkspacePath(workspace); - DatabaseFile databaseFile = getDatabaseFilePath(normalizedWorkspace); - QList threadIDs = identMap.keys(databaseFile + "|" + normalizedWorkspace); + MonotoneHandlePtr normalizedWorkspace = normalizeWorkspacePath(workspace); + MonotoneHandlePtr monotoneHandle = getMonotoneHandlePtrPath(normalizedWorkspace); + QList threadIDs = identMap.keys(monotoneHandle + "|" + normalizedWorkspace); L(QString("stopping %1 threads for workspace %2") .arg(threadIDs.size()).arg(normalizedWorkspace)); @@ -188,38 +148,8 @@ void MonotoneManager::stopWorkspaceThrea } } -WorkspacePath MonotoneManager::normalizeWorkspacePath(const WorkspacePath & workspace) -{ - QDir tempDir(workspace); - if (!tempDir.exists()) - { - throw GuitoneException(tr("Directory %1 does not exist").arg(workspace)); - } - - bool found = false; - WorkspacePath normalizedWorkspace; - do - { - if (tempDir.cd("_MTN")) - { - tempDir.cdUp(); - normalizedWorkspace = tempDir.absolutePath(); - found = true; - break; - } - } - while (!tempDir.isRoot() && tempDir.cdUp()); - - if (!found) - { - throw GuitoneException(tr("could not find _MTN directory")); - } - - return normalizedWorkspace; -} - // we assume that the workspace was already normalized here -DatabaseFile MonotoneManager::getDatabaseFilePath(const WorkspacePath & workspace) +MonotoneHandlePtr MonotoneManager::getMonotoneHandlePtrPath(const MonotoneHandlePtr & workspace) { // now check again if we know it if (workspaceMap.contains(workspace)) @@ -250,7 +180,7 @@ DatabaseFile MonotoneManager::getDatabas I(stanzas.size() == 1); Stanza st = stanzas.at(0); - DatabaseFile databaseFilePath; + MonotoneHandlePtr databaseFilePath; foreach (const StanzaEntry & entry, st) { if (entry.sym == "database") @@ -313,8 +243,8 @@ void MonotoneManager::aborted(int thread MonotoneThreadPtr thread = threadMap.value(threadID); - QString databaseFile = thread->getDatabaseFilePath(); - QString workspacePath = thread->getWorkspacePath(); + QString monotoneHandle = thread->getMonotoneHandlePtrPath(); + QString monotoneHandle = thread->getWorkspacePath(); removeThread(threadID); @@ -353,7 +283,7 @@ void MonotoneManager::aborted(int thread "The monotone process for '%1' died (%2). " "If you think this is a bug in guitone, " "please report it to the author!" - ).arg(workspacePath.isEmpty() ? databaseFile : workspacePath) + ).arg(monotoneHandle.isEmpty() ? monotoneHandle : monotoneHandle) .arg(processErrorTranslated) ); ============================================================ --- src/monotone/MonotoneManager.h 4d0a313dd2921a3b223d16683c48c81d177c627e +++ src/monotone/MonotoneManager.h 9a4a725a495b7ba94eca66cad0502641e176f092 @@ -37,27 +37,18 @@ public: //! returns if the path to the monotone binary was set successful before inline bool monotoneBinaryPathSet() const { return !mtnPath.isEmpty(); } - //! returns the database filepath for a given workspace path - DatabaseFile getDatabaseFilePath(const WorkspacePath &); + //! returns an appropriate MonotoneThread for the given handle + MonotoneThreadPtr getThread(const MonotoneHandlePtr &); - //! returns an appropriate MonotoneThread for the given workspace - MonotoneThreadPtr getThreadForWorkspace(const WorkspacePath &); - - //! returns an appropriate MonotoneThread for the given database - MonotoneThreadPtr getThreadForDatabase(const DatabaseFile &); - //! stops the thread with the given thread number void stopThread(int); - //! stops all threads for the given workspace - void stopWorkspaceThreads(const WorkspacePath &); + //! stops all threads for the given handle + void stopThreads(const MonotoneHandlePtr &); //! returns the interface version of a given monotone binary static QString getInterfaceVersion(const QString &); - //! returns the directory which contains the _MTN directory - static WorkspacePath normalizeWorkspacePath(const WorkspacePath &); - //! compares two version strings static int versionCompare(const QString &, const QString &); @@ -71,12 +62,11 @@ private: void threadAborted(const QString &); private: - MonotoneThreadPtr getThread(const DatabaseFile &, const WorkspacePath &); void removeThread(int); QMap threadMap; QMultiMap identMap; - QMap workspaceMap; + QMap workspaceMap; QSet stoppingThreads; QString mtnPath; ============================================================ --- src/monotone/MonotoneProcess.h 51bdb9f10ae2e07c2e52150a041ad04e5cb31f00 +++ src/monotone/MonotoneProcess.h 55157714f3c5a8f543178b37308972f51d0d7209 @@ -38,7 +38,7 @@ public: bool successful(); - static bool singleRun(const QStringList & params, const QString &, QString & output); + static bool singleRun(const QStringList &, const QString &, QString & output); signals: void output(const QString &); ============================================================ --- src/monotone/MonotoneThread.cpp 54f25692d5b1c89a4bd4ed42783bb4066a2b2e25 +++ src/monotone/MonotoneThread.cpp 9aee9375d154f37a24147ac87d1327806cc2ec46 @@ -170,7 +170,7 @@ MonotoneThread::MonotoneThread( MonotoneThread::MonotoneThread( int thread, const QString & m, const QString & d, const QString & w ) : QThread(), doAbort(false), commandNumber(0), threadNumber(thread), - mtnBinary(m), databasePath(d), workspacePath(w) + mtnBinary(m), databasePath(d), monotoneHandle(w) {} MonotoneThread::~MonotoneThread() {} @@ -248,7 +248,7 @@ void MonotoneThread::run() args << "automate"; args << "stdio"; args << QString("--automate-stdio-size=%1").arg(StdioBufferSize); - args << "--db" << databasePath; + args << "--handle" << databasePath; if (!Settings::getBool("ReadUserRcFiles")) { @@ -259,9 +259,9 @@ void MonotoneThread::run() args << "--rcfile" << rcFile.fileName(); // check whether we need to work on a specific workspace directory or not - if (!workspacePath.isEmpty()) + if (!monotoneHandle.isEmpty()) { - process->setWorkingDirectory(workspacePath); + process->setWorkingDirectory(monotoneHandle); } else { ============================================================ --- src/monotone/MonotoneThread.h ffbb03ad32a7f67796baebb2453a8e66a330ac72 +++ src/monotone/MonotoneThread.h e1f2a29a3682050496a8170dfcfa139f99e23b9f @@ -126,10 +126,10 @@ public: ~MonotoneThread(); //! returns the database filepath which has been loaded by this thread - inline QString getDatabaseFilePath() const { return databasePath; } + inline QString getMonotoneHandlePtrPath() const { return databasePath; } //! returns the workspace which has been set by this thread for the running instance (if any) - inline QString getWorkspacePath() const { return workspacePath; } + inline QString getWorkspacePath() const { return monotoneHandle; } //! returns the amount of tasks which are in the queue inline int getQueueCount() const { return queue.size(); } @@ -186,7 +186,7 @@ private: QString mtnBinary; QString databasePath; - QString workspacePath; + QString monotoneHandle; QQueue queue; QMutex lock; ============================================================ --- src/monotone/MonotoneUtil.cpp 30f5e234eb795caa6bb55747a51036aa5afaa94d +++ src/monotone/MonotoneUtil.cpp de3e8bbff078c511a63a47bea8a4a1d014b0cb63 @@ -42,7 +42,8 @@ void MonotoneUtil::taskAborted(const Mon emit finished(); } -void MonotoneUtil::run(const MonotoneThreadPtr & thread, const MonotoneTaskPtr & task) +void MonotoneUtil::run(const MonotoneThreadPtr & thread, + const MonotoneTaskPtr & task) { connect( thread.data(), SIGNAL(taskFinished(const MonotoneTaskPtr &)), @@ -73,29 +74,19 @@ void MonotoneUtil::run(const MonotoneThr ); } -void MonotoneUtil::runSynchronousWorkspaceTask(const WorkspacePath & workspace, const MonotoneTaskPtr & task) +void MonotoneUtil::runSynchronousTask(const MonotoneHandlePtr & handle, + const MonotoneTaskPtr & task) { - MonotoneUtil * instance = new MonotoneUtil(); - instance->run(APP->manager()->getThreadForWorkspace(workspace), task); - delete instance; + MonotoneUtil util; + util.run(APP->manager()->getThread(handle), task); } -void MonotoneUtil::runSynchronousDatabaseTask(const DatabaseFile & database, const MonotoneTaskPtr & task) +QString MonotoneUtil::getBaseWorkspaceRevision(const MonotoneHandlePtr & handle) { - MonotoneUtil * instance = new MonotoneUtil(); - instance->run(APP->manager()->getThreadForDatabase(database), task); - delete instance; -} + I(handle->getType() == MonotoneHandle::workspace_handle); -DatabaseFile MonotoneUtil::getDatabaseFile(const WorkspacePath & workspace) -{ - return APP->manager()->getDatabaseFilePath(workspace); -} - -QString MonotoneUtil::getBaseWorkspaceRevision(const WorkspacePath & workspace) -{ MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_base_revision_id")); - runSynchronousWorkspaceTask(workspace, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -117,10 +108,13 @@ QString MonotoneUtil::getBaseWorkspaceRe return data; } -QString MonotoneUtil::getOption(const WorkspacePath & workspace, const QString & opt) +QString MonotoneUtil::getOption(const MonotoneHandlePtr & handle, + const QString & opt) { + I(handle->getType() == MonotoneHandle::workspace_handle); + MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_option" << opt)); - runSynchronousWorkspaceTask(workspace, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -141,9 +135,10 @@ QString MonotoneUtil::getOption(const Wo return data; } -QString MonotoneUtil::getBranchName(const WorkspacePath & workspace, const QString & defaultBranch) +QString MonotoneUtil::getBranchName(const MonotoneHandlePtr & handle, + const QString & defaultBranch) { - QString branchName = getOption(workspace, "branch"); + QString branchName = getOption(handle, "branch"); if (branchName.size() == 0) { @@ -152,11 +147,11 @@ QString MonotoneUtil::getBranchName(cons return branchName; } -QString MonotoneUtil::getBranchNameShort(const WorkspacePath & workspace) +QString MonotoneUtil::getBranchNameShort(const MonotoneHandlePtr & handle) { - // FIXME: currently there is only support for the domain branch scheme - // tld.domain.project.branch - QString branchName = getBranchName(workspace); + // FIXME: currently there is only support for the domain + // branch scheme "tld.domain.project.branch" + QString branchName = getBranchName(handle); QStringList parts = branchName.split('.'); if (parts.size() == 1) return branchName; @@ -183,10 +178,11 @@ QString MonotoneUtil::getBranchNameShort return shortBranchName; } -QStringList MonotoneUtil::resolveSelector(const DatabaseFile & db, const QString & selector) +QStringList MonotoneUtil::resolveSelector(const MonotoneHandlePtr & handle, + const QString & selector) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "select" << selector)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -205,10 +201,11 @@ QStringList MonotoneUtil::resolveSelecto return revList; } -CertList MonotoneUtil::getCerts(const DatabaseFile & db, const QString & revision) +CertList MonotoneUtil::getCerts(const MonotoneHandlePtr & handle, + const QString & revision) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "certs" << revision)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -231,7 +228,7 @@ CertList MonotoneUtil::getCerts(const Da return certs; } -bool MonotoneUtil::createCert(const DatabaseFile & db, +bool MonotoneUtil::createCert(const MonotoneHandlePtr & handle, const QString & revision, const QString & name, const QString & value, const QString & key) { @@ -240,7 +237,7 @@ bool MonotoneUtil::createCert(const Data QStringList() << "k" << key )); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { @@ -258,10 +255,11 @@ bool MonotoneUtil::createCert(const Data return true; } -FileEntryList MonotoneUtil::getRevisionManifest(const DatabaseFile & db, const QString & revision) +FileEntryList MonotoneUtil::getRevisionManifest(const MonotoneHandlePtr & handle, + const QString & revision) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_manifest_of" << revision)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -321,10 +319,10 @@ FileEntryList MonotoneUtil::getRevisionM return entries; } -QMap MonotoneUtil::getPublicKeyMap(const DatabaseFile & db) +QMap MonotoneUtil::getPublicKeyMap(const MonotoneHandlePtr & handle) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "keys")); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -374,10 +372,10 @@ QMap MonotoneUtil::get return keys; } -QMap MonotoneUtil::getPrivateKeyMap(const DatabaseFile & db) +QMap MonotoneUtil::getPrivateKeyMap(const MonotoneHandlePtr & handle) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "keys")); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -427,10 +425,11 @@ QMap MonotoneUtil::get return keys; } -QString MonotoneUtil::getFileId(const DatabaseFile & db, const QString & path) +QString MonotoneUtil::getFileId(const MonotoneHandlePtr & handle, + const QString & path) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "identify" << path)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -449,10 +448,10 @@ QString MonotoneUtil::getFileId(const Da return data; } -QStringList MonotoneUtil::getRoots(const DatabaseFile & db, bool & ok) +QStringList MonotoneUtil::getRoots(const MonotoneHandlePtr & handle, bool & ok) { MonotoneTaskPtr task(new MonotoneTask(QStringList() << "roots")); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -473,14 +472,15 @@ QStringList MonotoneUtil::getRoots(const return data.split('\n', QString::SkipEmptyParts); } -QStringList MonotoneUtil::getCommonAncestors(const DatabaseFile & db, const QStringList & revs) +QStringList MonotoneUtil::getCommonAncestors(const MonotoneHandlePtr & handle, + const QStringList & revs) { QStringList args; args << "common_ancestors"; args += revs; MonotoneTaskPtr task(new MonotoneTask(args)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -498,12 +498,14 @@ QStringList MonotoneUtil::getCommonAnces return data.split('\n', QString::SkipEmptyParts); } -QStringList MonotoneUtil::getPreviousContentMarks(const DatabaseFile & db, const QString & file, const QString & startRev) +QStringList MonotoneUtil::getPreviousContentMarks(const MonotoneHandlePtr & handle, + const QString & file, + const QString & startRev) { QStringList args; args << "get_content_changed" << startRev << file; MonotoneTaskPtr task(new MonotoneTask(args)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -529,13 +531,14 @@ QStringList MonotoneUtil::getPreviousCon return revs; } -QStringList MonotoneUtil::topsortRevisions(const DatabaseFile & db, const QStringList & revs) +QStringList MonotoneUtil::topsortRevisions(const MonotoneHandlePtr & handle, + const QStringList & revs) { QStringList args; args << "toposort"; args += revs; MonotoneTaskPtr task(new MonotoneTask(args)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -554,11 +557,18 @@ QStringList MonotoneUtil::topsortRevisio return data.split("\n", QString::SkipEmptyParts); } -bool MonotoneUtil::getAttribute(const WorkspacePath & ws, const QString & path, - const QString & attrname, QPair & attrval) +bool MonotoneUtil::getAttribute(const MonotoneHandlePtr & handle, + const QString & path, + const QString & attrname, + QPair & attrval) { - MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_attributes" << path)); - runSynchronousWorkspaceTask(ws, task); + I(handle->getType() == MonotoneHandle::workspace_handle); + + MonotoneTaskPtr task(new MonotoneTask( + QStringList() << "get_attributes" << path + )); + runSynchronousTask(handle, task); + if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -590,10 +600,13 @@ bool MonotoneUtil::getAttribute(const Wo return false; } -bool MonotoneUtil::getAttribute(const DatabaseFile & db, const QString & revision, - const QString & path, const QString & attrname, QString & attrval) +bool MonotoneUtil::getAttribute(const MonotoneHandlePtr & handle, + const QString & revision, + const QString & path, + const QString & attrname, + QString & attrval) { - FileEntryList entryList = getRevisionManifest(db, revision); + FileEntryList entryList = getRevisionManifest(handle, revision); foreach (const FileEntry & en, entryList) { @@ -608,13 +621,13 @@ bool MonotoneUtil::getAttribute(const Da return false; } -QMap MonotoneUtil::getDatabaseVariables(const DatabaseFile & db, +QMap MonotoneUtil::getDatabaseVariables(const MonotoneHandlePtr & handle, const QString & domain) { QStringList args; args << "get_db_variables" << domain; MonotoneTaskPtr task(new MonotoneTask(args)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); @@ -647,15 +660,15 @@ QMap MonotoneUtil::get return entries; } -QString MonotoneUtil::getCorrespondingPath(const DatabaseFile & db, - const QString & rev1, - const QString & filePath, - const QString & rev2) +QString MonotoneUtil::getCorrespondingPath(const MonotoneHandlePtr & handle, + const QString & rev1, + const QString & filePath, + const QString & rev2) { QStringList args; args << "get_corresponding_path" << rev1 << filePath << rev2; MonotoneTaskPtr task(new MonotoneTask(args)); - runSynchronousDatabaseTask(db, task); + runSynchronousTask(handle, task); if (!task->isFinished()) { C(QString("task '%1' aborted").arg(QString(task->getEncodedInput()))); ============================================================ --- src/monotone/MonotoneUtil.h a42494f54155101db9f71a84a32ca3cfb94f2645 +++ src/monotone/MonotoneUtil.h 9af29c54ee20c9145b5a619daf276c1bd14661fc @@ -28,28 +28,26 @@ public: { Q_OBJECT public: - static void runSynchronousWorkspaceTask(const WorkspacePath &, const MonotoneTaskPtr &); - static void runSynchronousDatabaseTask(const DatabaseFile &, const MonotoneTaskPtr &); - static DatabaseFile getDatabaseFile(const WorkspacePath &); - static QString getBaseWorkspaceRevision(const WorkspacePath &); - static QString getOption(const WorkspacePath &, const QString &); - static QString getBranchName(const WorkspacePath &, const QString & defaultBranch = tr("[unknown branch]")); - static QString getBranchNameShort(const WorkspacePath &); - static QStringList resolveSelector(const DatabaseFile &, const QString &); - static CertList getCerts(const DatabaseFile &, const QString &); - static bool createCert(const DatabaseFile & db, const QString &, const QString &, const QString &, const QString &); - static FileEntryList getRevisionManifest(const DatabaseFile &, const QString &); - static QMap getPublicKeyMap(const DatabaseFile &); - static QMap getPrivateKeyMap(const DatabaseFile &); - static QStringList getPreviousContentMarks(const DatabaseFile &, const QString &, const QString &); - static QString getCorrespondingPath(const DatabaseFile &, const QString &, const QString &, const QString &); - static QString getFileId(const DatabaseFile &, const QString &); - static QStringList getRoots(const DatabaseFile &, bool &); - static QStringList topsortRevisions(const DatabaseFile &, const QStringList &); - static QStringList getCommonAncestors(const DatabaseFile &, const QStringList &); - static bool getAttribute(const WorkspacePath &, const QString &, const QString &, QPair &); - static bool getAttribute(const DatabaseFile &, const QString &, const QString &, const QString &, QString &); - static QMap getDatabaseVariables(const DatabaseFile &, const QString &); + static void runSynchronousTask(const MonotoneHandlePtr &, const MonotoneTaskPtr &); + static QString getBaseWorkspaceRevision(const MonotoneHandlePtr &); + static QString getOption(const MonotoneHandlePtr &, const QString &); + static QString getBranchName(const MonotoneHandlePtr &, const QString & defaultBranch = tr("[unknown branch]")); + static QString getBranchNameShort(const MonotoneHandlePtr &); + static QStringList resolveSelector(const MonotoneHandlePtr &, const QString &); + static CertList getCerts(const MonotoneHandlePtr &, const QString &); + static bool createCert(const MonotoneHandlePtr & db, const QString &, const QString &, const QString &, const QString &); + static FileEntryList getRevisionManifest(const MonotoneHandlePtr &, const QString &); + static QMap getPublicKeyMap(const MonotoneHandlePtr &); + static QMap getPrivateKeyMap(const MonotoneHandlePtr &); + static QStringList getPreviousContentMarks(const MonotoneHandlePtr &, const QString &, const QString &); + static QString getCorrespondingPath(const MonotoneHandlePtr &, const QString &, const QString &, const QString &); + static QString getFileId(const MonotoneHandlePtr &, const QString &); + static QStringList getRoots(const MonotoneHandlePtr &, bool &); + static QStringList topsortRevisions(const MonotoneHandlePtr &, const QStringList &); + static QStringList getCommonAncestors(const MonotoneHandlePtr &, const QStringList &); + static bool getAttribute(const MonotoneHandlePtr &, const QString &, const QString &, QPair &); + static bool getAttribute(const MonotoneHandlePtr &, const QString &, const QString &, const QString &, QString &); + static QMap getDatabaseVariables(const MonotoneHandlePtr &, const QString &); // FIXME: decide what to do with that static QString stripMtnPrefix(const QString &); ============================================================ --- src/monotone/WorkspaceCommitter.cpp 552526dc9dacf546ad039cbaa2bf03d7609cdc4d +++ src/monotone/WorkspaceCommitter.cpp 68b4a90293c03e120488357df87e332e46d6cb73 @@ -23,8 +23,8 @@ #include -WorkspaceCommitter::WorkspaceCommitter(const WorkspacePath & workspace, const GetRevision * model) - : QObject(0), workspacePath(workspace), revModel(model) {} +WorkspaceCommitter::WorkspaceCommitter(const MonotoneHandlePtr & workspace, const GetRevision * model) + : QObject(0), monotoneHandle(workspace), revModel(model) {} WorkspaceCommitter::~WorkspaceCommitter() {} @@ -48,7 +48,7 @@ bool WorkspaceCommitter::run(const QStri certs.insert("date", QDateTime::currentDateTime().toUTC().toString(Qt::ISODate)); - QDir workspaceDir(workspacePath); + QDir workspaceDir(monotoneHandle); I(workspaceDir.exists()); // @@ -76,7 +76,7 @@ bool WorkspaceCommitter::run(const QStri QStringList() << "put_revision" << revModel->getRevisionText() )); - MonotoneUtil::runSynchronousWorkspaceTask(workspacePath, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); if (!task->isFinished()) F("task aborted"); @@ -108,7 +108,7 @@ bool WorkspaceCommitter::writeRevision(c bool WorkspaceCommitter::writeRevision(const QString & revisionId) { - QDir workspaceDir(workspacePath); + QDir workspaceDir(monotoneHandle); I(workspaceDir.cd("_MTN")); QFile file(workspaceDir.filePath("revision")); @@ -143,7 +143,7 @@ bool WorkspaceCommitter::writeOptions(co bool WorkspaceCommitter::writeOptions(const QMap & certs) { - QDir workspaceDir(workspacePath); + QDir workspaceDir(monotoneHandle); I(workspaceDir.cd("_MTN")); QFile file(workspaceDir.filePath("options")); @@ -179,7 +179,7 @@ bool WorkspaceCommitter::putFile(const Q bool WorkspaceCommitter::putFile(const QString & fileName, const QString & fileId, const QString & baseId) { - QDir workspaceDir(workspacePath); + QDir workspaceDir(monotoneHandle); QFile file(workspaceDir.filePath(fileName)); if (!file.exists()) { @@ -207,7 +207,7 @@ bool WorkspaceCommitter::putFile(const Q file.close(); MonotoneTaskPtr task(new MonotoneTask(command)); - MonotoneUtil::runSynchronousWorkspaceTask(workspacePath, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); if (!task->isFinished()) F("task aborted"); QString data = task->getDecodedOutput(); @@ -240,7 +240,7 @@ bool WorkspaceCommitter::putCert(const Q QStringList() << "key" << commitKey )); - MonotoneUtil::runSynchronousWorkspaceTask(workspacePath, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); if (!task->isFinished()) F("task aborted"); QString data = task->getDecodedOutput(); ============================================================ --- src/monotone/WorkspaceCommitter.h c2507e2154158f9745dfb7743d6bf4b0b9544d17 +++ src/monotone/WorkspaceCommitter.h 270854dcaa6e3bd810b62c15acc611fec7886fa4 @@ -33,7 +33,7 @@ public: { Q_OBJECT public: - WorkspaceCommitter(const WorkspacePath &, const GetRevision *); + WorkspaceCommitter(const MonotoneHandlePtr &, const GetRevision *); ~WorkspaceCommitter(); bool run(const QString &, const QString &, const QString &, const QString &); @@ -46,7 +46,7 @@ private: bool writeOptions(const QMap &); QString revisionId; - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; const GetRevision * revModel; }; ============================================================ --- src/monotone/WorkspaceCreator.cpp e2abf1e85e13092c96106650fb5a29c9d1c040bf +++ src/monotone/WorkspaceCreator.cpp b2920894fe08036209a860d94c524eca56c10f4b @@ -22,15 +22,16 @@ #include -WorkspaceCreator::WorkspaceCreator(const QString & databaseFile, const QString & rev, const QDir & dir) - : FileExporter(databaseFile, rev, dir) +WorkspaceCreator::WorkspaceCreator(const MonotoneHandlePtr & monotoneHandle, + const QString & rev, const QDir & dir) + : FileExporter(monotoneHandle, rev, dir) {} bool WorkspaceCreator::run() { // at first determine the branch name(s) of the revision and let the // user select one branch of a list of branches - CertList certs = MonotoneUtil::getCerts(databaseFile, revision); + CertList certs = MonotoneUtil::getCerts(monotoneHandle, revision); QStringList branches = certs.findByNameValues("branch"); if (branches.size() == 0) @@ -59,7 +60,7 @@ bool WorkspaceCreator::run() selectedBranch = branch; } - if (!createBookkeepingDirectory(rootDir, databaseFile, + if (!createBookkeepingDirectory(rootDir, monotoneHandle, selectedBranch, revision)) { return false; @@ -67,12 +68,12 @@ bool WorkspaceCreator::run() // finally query and export the manifest contents return FileExporter::run( - MonotoneUtil::getRevisionManifest(databaseFile, revision) + MonotoneUtil::getRevisionManifest(monotoneHandle, revision) ); } bool WorkspaceCreator::createBookkeepingDirectory(QDir workspace, - const DatabaseFile & db, + const MonotoneHandlePtr & handle, const QString & branch, const QString & revision) { @@ -97,7 +98,7 @@ bool WorkspaceCreator::createBookkeeping StanzaList stanzas; Stanza stanza; - stanza.append(StanzaEntry("database", QStringList() << db)); + stanza.append(StanzaEntry("database", QStringList() << handle)); stanza.append(StanzaEntry("branch", QStringList() << branch)); stanzas.append(stanza); ============================================================ --- src/monotone/WorkspaceCreator.h fb360d6db113e9ee9e6a7390be170d1e43f20e48 +++ src/monotone/WorkspaceCreator.h 3af419e9c390d01109e07f33f7708c976a4ae765 @@ -25,11 +25,11 @@ public: { Q_OBJECT public: - WorkspaceCreator(const DatabaseFile &, const QString &, const QDir &); + WorkspaceCreator(const MonotoneHandlePtr &, const QString &, const QDir &); bool run(); static bool createBookkeepingDirectory(QDir workspace, - const DatabaseFile & db, + const MonotoneHandlePtr & db, const QString & branch, const QString & revision = QString()); }; ============================================================ --- src/view/dialogs/AnnotateFile.cpp 9d9aae6eaa58f6b1f01872500ced7a7097664d49 +++ src/view/dialogs/AnnotateFile.cpp 24eb167f9665d569b034acfa5520f15d9fcd4f59 @@ -22,8 +22,8 @@ #include #include -AnnotateFile::AnnotateFile(QWidget * parent, const DatabaseFile & db) - : Dialog(parent), databaseFile(db), annotateModel(0) +AnnotateFile::AnnotateFile(QWidget * parent, const MonotoneHandlePtr & handle) + : Dialog(parent), monotoneHandle(handle), annotateModel(0) { setupUi(this); Dialog::init(); @@ -35,7 +35,7 @@ AnnotateFile::AnnotateFile(QWidget * par baseRevision, SLOT(clear()) ); - certList->setKeyMap(MonotoneUtil::getPublicKeyMap(databaseFile)); + certList->setKeyMap(MonotoneUtil::getPublicKeyMap(monotoneHandle)); annotateModel = new Annotate(this); annotationView->setModel(annotateModel); @@ -101,7 +101,7 @@ void AnnotateFile::read(const QString & baseRevision->setCurrentIndex(pos); setWindowTitle(tr("Annotation of %1").arg(filePath)); - annotateModel->readAnnotation(databaseFile, rev, filePath); + annotateModel->readAnnotation(monotoneHandle, rev, filePath); progressWidget->show(); } @@ -116,7 +116,7 @@ void AnnotateFile::setSelectedRevision(c if (!currentBaseRevision.isEmpty()) { newPath = MonotoneUtil::getCorrespondingPath( - databaseFile, currentBaseRevision, filePath, rev + monotoneHandle, currentBaseRevision, filePath, rev ); } @@ -162,7 +162,7 @@ void AnnotateFile::contextMenuRequested( Q_UNUSED(indexList); QString rev = annotateModel->getSelectedRevision(); - QStringList parents = MonotoneUtil::resolveSelector(databaseFile, "p:" + rev); + QStringList parents = MonotoneUtil::resolveSelector(monotoneHandle, "p:" + rev); QMenu menu(this); QFont activeFont; ============================================================ --- src/view/dialogs/AnnotateFile.h 7f3392e328b31a5daf075dd8f95491d6846ffe57 +++ src/view/dialogs/AnnotateFile.h 6676a9a9d44f33d362f0998dcb4d1de9ab642e32 @@ -29,7 +29,7 @@ public: Q_OBJECT public: - AnnotateFile(QWidget *, const DatabaseFile &); + AnnotateFile(QWidget *, const MonotoneHandlePtr &); ~AnnotateFile(); public slots: @@ -43,7 +43,7 @@ private: void revisionDiff(const QString &, const QString &, const QString &); private: - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; Annotate * annotateModel; QString filePath; ============================================================ --- src/view/dialogs/ChangesetBrowser.cpp f117411e2282c972bfbc24d252c498b49dd6cc61 +++ src/view/dialogs/ChangesetBrowser.cpp f9ac55614adfd2af499a463e0c5da320905b40ad @@ -25,8 +25,8 @@ #include #include -ChangesetBrowser::ChangesetBrowser(QWidget * parent, const DatabaseFile & db) - : Dialog(parent), databaseFile(db), branchModel(0) +ChangesetBrowser::ChangesetBrowser(QWidget * parent, const MonotoneHandlePtr & handle) + : Dialog(parent), monotoneHandle(handle), branchModel(0) { setupUi(this); Dialog::init(); @@ -42,7 +42,7 @@ ChangesetBrowser::ChangesetBrowser(QWidg changesetsSplitter->restoreState(); changeLogSplitter->restoreState(); - branchModel = new Branches(this, databaseFile); + branchModel = new Branches(this, monotoneHandle); branchProxyModel = new BranchesProxyModel(this); branchProxyModel->setSourceModel(branchModel); @@ -84,9 +84,9 @@ ChangesetBrowser::ChangesetBrowser(QWidg branchModel, SLOT(readBranches()) ); - changeLog->setKeyMap(MonotoneUtil::getPublicKeyMap(databaseFile)); + changeLog->setKeyMap(MonotoneUtil::getPublicKeyMap(monotoneHandle)); - branchLogModel = new GetBranchLog(this, databaseFile); + branchLogModel = new GetBranchLog(this, monotoneHandle); changesetView->setModel(branchLogModel); changesetView->setRootIsDecorated(false); @@ -222,7 +222,7 @@ void ChangesetBrowser::changesetViewClic QModelIndex revIdx = branchLogModel->index(idx.row(), 3, QModelIndex()); currentRevision = branchLogModel->data(revIdx, Qt::DisplayRole).toString(); changeLog->setCertList(branchLogModel->getCerts(currentRevision)); - revisionModel->readDatabaseRevision(databaseFile, currentRevision); + revisionModel->readDatabaseRevision(monotoneHandle, currentRevision); revisionParents->clear(); multipleParents->setVisible(false); } @@ -426,7 +426,7 @@ void ChangesetBrowser::suspendBranch(con // since suspend certs are ignored by default already, we should not // need to check if the returned revisions have already been suspended QStringList revisions = - MonotoneUtil::resolveSelector(databaseFile, "h:" + branch); + MonotoneUtil::resolveSelector(monotoneHandle, "h:" + branch); if (revisions.size() == 0) { @@ -441,7 +441,7 @@ void ChangesetBrowser::suspendBranch(con } QMap privateKeys = - MonotoneUtil::getPrivateKeyMap(databaseFile); + MonotoneUtil::getPrivateKeyMap(monotoneHandle); if (privateKeys.size() == 0) { @@ -482,7 +482,7 @@ void ChangesetBrowser::suspendBranch(con foreach (const QString & revision, revisions) { - if (!MonotoneUtil::createCert(databaseFile, revision, "suspend", branch, key)) + if (!MonotoneUtil::createCert(monotoneHandle, revision, "suspend", branch, key)) { QMessageBox::critical( this, ============================================================ --- src/view/dialogs/ChangesetBrowser.h 2af4dcc3a6843e8545d98b7054fb7c9b398e7aaa +++ src/view/dialogs/ChangesetBrowser.h 3f4d7d1fbc5c51c9150d38e5ec7aa4c6645af8f0 @@ -32,7 +32,7 @@ public: { Q_OBJECT public: - ChangesetBrowser(QWidget *, const DatabaseFile &); + ChangesetBrowser(QWidget *, const MonotoneHandlePtr &); ~ChangesetBrowser(); void init(); @@ -70,7 +70,7 @@ private: void suspendBranch(const QString &); private: - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; BranchesProxyModel * branchProxyModel; Branches * branchModel; GetBranchLog * branchLogModel; ============================================================ --- src/view/dialogs/CheckoutRevision.cpp 08a5fb3bd73416a58393d9271b0e9f22710805d6 +++ src/view/dialogs/CheckoutRevision.cpp effa35c60c7d2cd8668de010d3ec98544f9b5c23 @@ -25,17 +25,17 @@ #include #include -CheckoutRevision::CheckoutRevision(QWidget * parent, const DatabaseFile & database) - : Dialog(parent), databaseFile(database) +CheckoutRevision::CheckoutRevision(QWidget * parent, const MonotoneHandlePtr & database) + : Dialog(parent), monotoneHandle(database) { setupUi(this); Dialog::init(); - branchesModel = new Branches(this, databaseFile); + branchesModel = new Branches(this, monotoneHandle); branchesModel->readBranches(); branchList->setModel(branchesModel); - tagsModel = new Tags(this, databaseFile); + tagsModel = new Tags(this, monotoneHandle); tagsModel->readTags(QString()); tagList->setModel(tagsModel); @@ -135,7 +135,7 @@ void CheckoutRevision::accept() Settings::addItemToList("RecentCheckoutSelectors", selection, 10); } - QStringList revList(MonotoneUtil::resolveSelector(databaseFile, selector)); + QStringList revList(MonotoneUtil::resolveSelector(monotoneHandle, selector)); if (revList.size() == 0) { @@ -178,7 +178,7 @@ void CheckoutRevision::accept() return; } - WorkspaceCreator creator(databaseFile, revList.at(0), checkoutDir); + WorkspaceCreator creator(monotoneHandle, revList.at(0), checkoutDir); if (!creator.run()) { ============================================================ --- src/view/dialogs/CheckoutRevision.h 643632486232552a5647b6229826ecffae77aa81 +++ src/view/dialogs/CheckoutRevision.h d3a32557f6207f720fac706237c2c3ab41fa695f @@ -32,7 +32,7 @@ public: Q_OBJECT public: - CheckoutRevision(QWidget *, const DatabaseFile &); + CheckoutRevision(QWidget *, const MonotoneHandlePtr &); ~CheckoutRevision(); inline QString getSelectedRevision() const { return selectedRevisionId; } inline QDir getSelectedCheckoutDirectory() const { @@ -52,7 +52,7 @@ private: QCompleter * selectorCompleter; QString selectedRevisionId; QDir selectedCheckoutDirectory; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; private slots: void slotSelectRevision(); ============================================================ --- src/view/dialogs/CommitRevision.cpp cea026866a5a7b92bfe0784e1741d009069f2a25 +++ src/view/dialogs/CommitRevision.cpp 876a3055bffea87de28896fc8a9034e0314a0369 @@ -26,8 +26,8 @@ #include #include -CommitRevision::CommitRevision(QWidget * parent, const WorkspacePath & workspace) - : Dialog(parent), workspacePath(workspace) +CommitRevision::CommitRevision(QWidget * parent, const MonotoneHandlePtr & workspace) + : Dialog(parent), monotoneHandle(workspace) { setupUi(this); Dialog::init(); @@ -63,7 +63,7 @@ void CommitRevision::readWorkspaceRevisi void CommitRevision::readWorkspaceRevision(const QStringList & paths) { - revModel->readWorkspaceRevision(workspacePath, paths); + revModel->readWorkspaceRevision(monotoneHandle, paths); // while we're inserting items we don't want to receive these signals // i.e. we don't want to pre-fill the changelog text @@ -92,7 +92,7 @@ void CommitRevision::readWorkspaceRevisi ); QMap privateKeys = - MonotoneUtil::getPrivateKeyMap(MonotoneUtil::getDatabaseFile(workspacePath)); + MonotoneUtil::getPrivateKeyMap(MonotoneUtil::getMonotoneHandlePtr(monotoneHandle)); if (privateKeys.size() == 0) { @@ -130,7 +130,7 @@ void CommitRevision::accept() Settings::addItemToList("ChangelogEntries", changelogEntry->toPlainText(), 10); - QString branch = MonotoneUtil::getBranchName(workspacePath, QString()); + QString branch = MonotoneUtil::getBranchName(monotoneHandle, QString()); if (branch.isEmpty() && !checkAltBranch->isChecked()) { @@ -183,7 +183,7 @@ void CommitRevision::accept() QString selectedKey = keys->itemData(keys->currentIndex()).toString(); - WorkspaceCommitter committer(workspacePath, revModel); + WorkspaceCommitter committer(monotoneHandle, revModel); if (!committer.run(selectedKey, branch, author, changelogEntry->toPlainText())) { ============================================================ --- src/view/dialogs/CommitRevision.h c4debe06e5d659af57f0f7af563c0a3562b433d1 +++ src/view/dialogs/CommitRevision.h cf9b6fc36738e60a002383c833eef5e60a8ddd9c @@ -28,7 +28,7 @@ public: Q_OBJECT public: - CommitRevision(QWidget *, const WorkspacePath &); + CommitRevision(QWidget *, const MonotoneHandlePtr &); ~CommitRevision(); public slots: @@ -40,7 +40,7 @@ private: private: GetRevision * revModel; - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; private slots: void setChangelogEntryFromList(int); ============================================================ --- src/view/dialogs/CreateCert.cpp ac94b7b337dad8ddffb2ed525df90360bd54e261 +++ src/view/dialogs/CreateCert.cpp 281888ab6c2794a51051fd5c1f79affbb4d65f25 @@ -21,8 +21,8 @@ #include -CreateCert::CreateCert(QWidget * parent, const DatabaseFile & db) - : Dialog(parent), database(db) +CreateCert::CreateCert(QWidget * parent, const MonotoneHandlePtr & handle) + : Dialog(parent), database(handle) { setupUi(this); Dialog::init(); ============================================================ --- src/view/dialogs/CreateCert.h 3252da5f64e71bb138f3450c7d9ed48066f9382b +++ src/view/dialogs/CreateCert.h c03f9fd29d66fb7c858c4845fb06506086d1050f @@ -30,7 +30,7 @@ public: Q_OBJECT public: - CreateCert(QWidget *, const DatabaseFile &); + CreateCert(QWidget *, const MonotoneHandlePtr &); ~CreateCert(); void init(const QString &, const QString & certName = QString()); @@ -48,7 +48,7 @@ private: QMap nameTypeMap; QMap typeWidgetMap; - DatabaseFile database; + MonotoneHandlePtr database; private slots: void nameIndexChanged(int index); ============================================================ --- src/view/dialogs/CreateDatabase.cpp 3e3252bd4c9fe7b305adc2c3b939eb1210e35202 +++ src/view/dialogs/CreateDatabase.cpp 717f464eba28ebbe024b734c67db6f11727efb02 @@ -96,7 +96,7 @@ void CreateDatabase::accept() } QStringList params; - params << "db" << "init" << "-d" << filePath; + params << "handle" << "init" << "-d" << filePath; QString output; bool res = MonotoneProcess::singleRun(params, QString(), output); @@ -122,7 +122,7 @@ void CreateDatabase::doBrowseFiles() QString fileName = QFileDialog::getSaveFileName(this, tr("Save Database"), "database.mtn", - tr("Monotone databases (*.mtn *.db)")); + tr("Monotone databases (*.mtn *.handle)")); databasePath->setText(fileName); } ============================================================ --- src/view/dialogs/DatabaseDialogManager.cpp 052e2022d9c33fe5a22d8ada9d29dcaa8dc13c4e +++ src/view/dialogs/DatabaseDialogManager.cpp 735c030a3f05b6e99ab9590c57dc8a1b46d8c2be @@ -68,9 +68,9 @@ void DatabaseDialogManager::closeAllDial DialogManager::closeAllDialogs(); } -void DatabaseDialogManager::init(const DatabaseFile & db) +void DatabaseDialogManager::init(const MonotoneHandlePtr & handle) { - databaseFile = db; + monotoneHandle = handle; cleanup(); } @@ -78,7 +78,7 @@ void DatabaseDialogManager::showChangese { if (!changesetBrowser) { - changesetBrowser = new ChangesetBrowser(parentWidget(), databaseFile); + changesetBrowser = new ChangesetBrowser(parentWidget(), monotoneHandle); connect( changesetBrowser, SIGNAL(certCreated(const QString &, const QString &, @@ -129,7 +129,7 @@ void DatabaseDialogManager::showCheckout { if (!checkoutRevision) { - checkoutRevision = new CheckoutRevision(parentWidget(), databaseFile); + checkoutRevision = new CheckoutRevision(parentWidget(), monotoneHandle); connect( checkoutRevision, SIGNAL(selectRevisionFromSelector(const QString &)), @@ -158,7 +158,7 @@ void DatabaseDialogManager::showFileDiff fileDiff = new FileDiff(parentWidget()); } - fileDiff->forDatabase(databaseFile, file, base, target); + fileDiff->forDatabase(monotoneHandle, file, base, target); showDialog(fileDiff); } @@ -166,7 +166,7 @@ void DatabaseDialogManager::showFileHist { if (!fileHistory) { - fileHistory = new FileHistory(parentWidget(), databaseFile); + fileHistory = new FileHistory(parentWidget(), monotoneHandle); connect( fileHistory, SIGNAL(fileDiff(const QString &, const QString &, const QString &)), @@ -182,7 +182,7 @@ void DatabaseDialogManager::showGenerate { if (!generateKeypair) { - generateKeypair = new GenerateKeypair(parentWidget(), databaseFile); + generateKeypair = new GenerateKeypair(parentWidget(), monotoneHandle); connect( generateKeypair, SIGNAL(keypairGenerated(const QString &)), @@ -197,7 +197,7 @@ void DatabaseDialogManager::showNetsync( { if (!netsync) { - netsync = new Netsync(parentWidget(), databaseFile); + netsync = new Netsync(parentWidget(), monotoneHandle); } netsync->init(); @@ -208,7 +208,7 @@ void DatabaseDialogManager::showKeyManag { if (!keyManagement) { - keyManagement = new KeyManagement(parentWidget(), databaseFile); + keyManagement = new KeyManagement(parentWidget(), monotoneHandle); connect( keyManagement, SIGNAL(generateKeypair()), @@ -247,7 +247,7 @@ void DatabaseDialogManager::showRevision ); } - revisionDiff->forDatabase(databaseFile, path, base, target); + revisionDiff->forDatabase(monotoneHandle, path, base, target); showDialog(revisionDiff); } @@ -255,7 +255,7 @@ void DatabaseDialogManager::showRevision { if (!revisionManifest) { - revisionManifest = new RevisionManifest(parentWidget(), databaseFile); + revisionManifest = new RevisionManifest(parentWidget(), monotoneHandle); connect( revisionManifest, SIGNAL(fileHistory(const QString &, const QString &)), @@ -281,7 +281,7 @@ void DatabaseDialogManager::showSelectRe { if (!selectRevision) { - selectRevision = new SelectRevision(parentWidget(), databaseFile); + selectRevision = new SelectRevision(parentWidget(), monotoneHandle); connect( selectRevision, SIGNAL(revisionDiff(const QString &, const QString &, const QString &)), @@ -311,7 +311,7 @@ void DatabaseDialogManager::showNewProje { if (!newProjectSetup) { - newProjectSetup = new NewProjectSetup(parentWidget(), databaseFile); + newProjectSetup = new NewProjectSetup(parentWidget(), monotoneHandle); // delegate this further connect( @@ -328,7 +328,7 @@ void DatabaseDialogManager::showAnnotati { if (!annotateFile) { - annotateFile = new AnnotateFile(parentWidget(), databaseFile); + annotateFile = new AnnotateFile(parentWidget(), monotoneHandle); connect( annotateFile, SIGNAL(selectRevision()), @@ -364,7 +364,7 @@ void DatabaseDialogManager::showCreateCe { if (!createCert) { - createCert = new CreateCert(parentWidget(), databaseFile); + createCert = new CreateCert(parentWidget(), monotoneHandle); connect( createCert, SIGNAL(selectRevision()), ============================================================ --- src/view/dialogs/DatabaseDialogManager.h 6fcc736dab49c005d9e30c7ee5d53978f2d09c83 +++ src/view/dialogs/DatabaseDialogManager.h 786df3fcd74a012b44c064eb935b8af2c44d94ad @@ -41,7 +41,7 @@ public: DatabaseDialogManager(QWidget *); ~DatabaseDialogManager(); - void init(const DatabaseFile &); + void init(const MonotoneHandlePtr &); virtual void closeAllDialogs(); //! delegated signals @@ -87,7 +87,7 @@ private: private: void cleanup(); - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/view/dialogs/FileDiff.cpp 44fc4a74f158ae9a6d8a5e855521dc7b8527977b +++ src/view/dialogs/FileDiff.cpp fe8603471cad4cbdc948351faa2a1fff6217f011 @@ -109,14 +109,14 @@ FileDiff::FileDiff(QWidget * parent) ); } -void FileDiff::forDatabase(const DatabaseFile & db, const QString & file, +void FileDiff::forDatabase(const MonotoneHandlePtr & handle, const QString & file, const QString & base, const QString & target) { fileName = file; - database = db; + database = handle; QString encoding = "UTF-8"; - if (!MonotoneUtil::getAttribute(db, base, file, "guitone:file-encoding", + if (!MonotoneUtil::getAttribute(handle, base, file, "guitone:file-encoding", encoding)) { L(QString("could not query file encoding of %1, using default").arg(file)); @@ -136,18 +136,18 @@ void FileDiff::forDatabase(const Databas setWindowTitle(tr("Loading file differences")); - diffModel->readDatabaseDiff(db, fileName, base, target, encoding); + diffModel->readDatabaseDiff(handle, fileName, base, target, encoding); } -void FileDiff::forWorkspace(const WorkspacePath & ws, const QString & file, +void FileDiff::forWorkspace(const MonotoneHandlePtr & handle, const QString & file, const QString & base, const QString & target) { fileName = file; - workspace = ws; + workspace = handle; QString encoding = "UTF-8"; QPair attrval; - if (!MonotoneUtil::getAttribute(ws, file, "guitone:file-encoding", attrval) || + if (!MonotoneUtil::getAttribute(handle, file, "guitone:file-encoding", attrval) || attrval.second == "dropped") { L(QString("could not query file encoding of %1, using default").arg(file)); @@ -171,7 +171,7 @@ void FileDiff::forWorkspace(const Worksp setWindowTitle(tr("Loading file differences")); - diffModel->readWorkspaceDiff(ws, fileName, base, target, encoding); + diffModel->readWorkspaceDiff(handle, fileName, base, target, encoding); } FileDiff::~FileDiff() @@ -218,7 +218,7 @@ void FileDiff::diffRead() if (database.isEmpty()) { I(!workspace.isEmpty()); - database = MonotoneUtil::getDatabaseFile(workspace); + database = MonotoneUtil::getMonotoneHandlePtr(workspace); } fileModel->readFileByName(database, fileName, base, textEncoding->currentText()); @@ -343,7 +343,7 @@ void FileDiff::switchOutputEncoding(cons << encoding )); - MonotoneUtil::runSynchronousWorkspaceTask(workspace, task); + MonotoneUtil::runSynchronousTask(workspace, task); if (task->getReturnCode() != 0) { ============================================================ --- src/view/dialogs/FileDiff.h dbb985d3ede28d6077676ddd35927bdfb03347cc +++ src/view/dialogs/FileDiff.h 35927e2ed2cfe3e530d8f9b366ed501a58f36f32 @@ -32,8 +32,8 @@ public: FileDiff(QWidget *); ~FileDiff(); - void forDatabase(const DatabaseFile &, const QString &, const QString &, const QString &); - void forWorkspace(const WorkspacePath &, const QString &, const QString &, const QString &); + void forDatabase(const MonotoneHandlePtr &, const QString &, const QString &, const QString &); + void forWorkspace(const MonotoneHandlePtr &, const QString &, const QString &, const QString &); private slots: void diffRead(); @@ -52,8 +52,8 @@ private: GetFileProxyModel * fileProxyModel; QModelIndex currentIndex; QString fileName; - WorkspacePath workspace; - DatabaseFile database; + MonotoneHandlePtr workspace; + MonotoneHandlePtr database; }; #endif ============================================================ --- src/view/dialogs/FileHistory.cpp 39a8761450d502b9479f27973c791e155b35cf54 +++ src/view/dialogs/FileHistory.cpp f96c1c9b8b2bf3878ca25ca19a0e840393add792 @@ -19,7 +19,7 @@ #include "FileHistory.h" #include "MonotoneUtil.h" -FileHistory::FileHistory(QWidget * parent, const DatabaseFile & databaseFile) +FileHistory::FileHistory(QWidget * parent, const MonotoneHandlePtr & monotoneHandle) : Dialog(parent) { setupUi(this); @@ -27,10 +27,10 @@ FileHistory::FileHistory(QWidget * paren splitter->restoreState(); - certList->setKeyMap(MonotoneUtil::getPublicKeyMap(databaseFile)); + certList->setKeyMap(MonotoneUtil::getPublicKeyMap(monotoneHandle)); - changeModel = new GetContentChanged(this, databaseFile); - certsModel = new Certs(this, databaseFile); + changeModel = new GetContentChanged(this, monotoneHandle); + certsModel = new Certs(this, monotoneHandle); connect( this, SIGNAL(dialogHidden()), ============================================================ --- src/view/dialogs/FileHistory.h d543deea2159e969268866f3626cedfc441f84b3 +++ src/view/dialogs/FileHistory.h 749b32ab1e7448ccf8e3efb3d0708cdd52d2c604 @@ -28,7 +28,7 @@ public: { Q_OBJECT public: - FileHistory(QWidget *, const DatabaseFile &); + FileHistory(QWidget *, const MonotoneHandlePtr &); ~FileHistory(); void readHistory(const QString &, const QString &); ============================================================ --- src/view/dialogs/GenerateKeypair.cpp 12446002b36af694fa6bbbe6f4d1eee11218db59 +++ src/view/dialogs/GenerateKeypair.cpp 2b09cca3244f89a8a8b71b53ea5c043fa2f1150c @@ -24,8 +24,8 @@ #include #include -GenerateKeypair::GenerateKeypair(QWidget * parent, const DatabaseFile & db) - : Dialog(parent), databaseFile(db) +GenerateKeypair::GenerateKeypair(QWidget * parent, const MonotoneHandlePtr & handle) + : Dialog(parent), monotoneHandle(handle) { setupUi(this); Dialog::init(); @@ -71,7 +71,7 @@ void GenerateKeypair::accept() << lineKeyPasswd->text(), options )); - MonotoneUtil::runSynchronousDatabaseTask(databaseFile, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); if (!task->isFinished()) { ============================================================ --- src/view/dialogs/GenerateKeypair.h 2f96e57ae54980f65a2420bcb78e8ae7f03adb2c +++ src/view/dialogs/GenerateKeypair.h 30119d4fdcfc15ee7c2a3a14e606022b46efc6b5 @@ -27,7 +27,7 @@ public: { Q_OBJECT public: - GenerateKeypair(QWidget *, const DatabaseFile &); + GenerateKeypair(QWidget *, const MonotoneHandlePtr &); ~GenerateKeypair(); signals: @@ -37,7 +37,7 @@ private: void accept(); private: - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/view/dialogs/KeyManagement.cpp 995e2e3ec808f8eae6bdf033f76ca832dbf514e6 +++ src/view/dialogs/KeyManagement.cpp e2a0a71a99464a3acf9ea4fdd62f1c4e0b03f5eb @@ -25,13 +25,13 @@ #include #include -KeyManagement::KeyManagement(QWidget * parent, const DatabaseFile & db) - : Dialog(parent), databaseFile(db) +KeyManagement::KeyManagement(QWidget * parent, const MonotoneHandlePtr & handle) + : Dialog(parent), monotoneHandle(handle) { setupUi(this); Dialog::init(); - model = new Keys(this, databaseFile); + model = new Keys(this, monotoneHandle); proxyModel = new QSortFilterProxyModel(this); proxyModel->setSourceModel(model); proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); @@ -198,7 +198,7 @@ void KeyManagement::copyPubkeyDataToClip QStringList args; QString output; - args << "-d" << databaseFile << "pubkey" << key->hash; + args << "-d" << monotoneHandle << "pubkey" << key->hash; if (!MonotoneProcess::singleRun(args, QString(), output)) { @@ -273,7 +273,7 @@ void KeyManagement::dropKey() } QStringList args; - args << "-d" << databaseFile << "dropkey" << key->hash; + args << "-d" << monotoneHandle << "dropkey" << key->hash; QString output; if (!MonotoneProcess::singleRun(args, QString(), output)) ============================================================ --- src/view/dialogs/KeyManagement.h b53a2b1f764b2787cb72beaf6694f1904077e8fd +++ src/view/dialogs/KeyManagement.h 5f8ee2ddc0d199e9f3cfed4a9bf4f6b875e1ca77 @@ -31,7 +31,7 @@ public: { Q_OBJECT public: - KeyManagement(QWidget *, const DatabaseFile &); + KeyManagement(QWidget *, const MonotoneHandlePtr &); ~KeyManagement(); public slots: @@ -46,7 +46,7 @@ private: Keys * model; QSortFilterProxyModel * proxyModel; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; QAction * actCopyHash; QAction * actCopyGivenName; ============================================================ --- src/view/dialogs/Netsync.cpp 05beca66608fae00fd596121e46c4ccf9f797d2e +++ src/view/dialogs/Netsync.cpp 7f89aa2b8477875ec94998e7a49b2ae5054a3d6f @@ -22,8 +22,8 @@ #include -Netsync::Netsync(QWidget * parent, const DatabaseFile & database) - : Dialog(parent), db(database), running(false) +Netsync::Netsync(QWidget * parent, const MonotoneHandlePtr & database) + : Dialog(parent), handle(database), running(false) { setupUi(this); Dialog::init(); @@ -46,10 +46,10 @@ void Netsync::init() progressWidget->hide(); QMap defaults = - MonotoneUtil::getDatabaseVariables(db, "database"); + MonotoneUtil::getDatabaseVariables(handle, "database"); QList knownServers = - (MonotoneUtil::getDatabaseVariables(db, "known-servers")).keys(); + (MonotoneUtil::getDatabaseVariables(handle, "known-servers")).keys(); includePattern->setText(defaults.contains("default-include-pattern") ? defaults["default-include-pattern"] : "*"); @@ -70,7 +70,7 @@ void Netsync::init() } QMap privateKeys = - MonotoneUtil::getPrivateKeyMap(db); + MonotoneUtil::getPrivateKeyMap(handle); keys->clear(); keys->addItem(tr(""), QString()); @@ -108,7 +108,7 @@ void Netsync::start(Action act, } MonotoneTaskPtr task(new MonotoneTask(cmd, opts)); - AutomateCommand::enqueueDatabaseTask(db, task); + AutomateCommand::enqueueDatabaseTask(handle, task); progressText->setStyleSheet("QLabel { color: palette(text); }"); progressText->setText(tr("Connecting to %1...").arg(host)); ============================================================ --- src/view/dialogs/Netsync.h 7e44535efac3ff677517b971814725039aea8dfc +++ src/view/dialogs/Netsync.h 60c3bdb65cba46c0f5305f8bf1dc36ac445dd461 @@ -30,7 +30,7 @@ public: public: enum Action { Push, Pull, Sync }; - Netsync(QWidget *, const DatabaseFile &); + Netsync(QWidget *, const MonotoneHandlePtr &); ~Netsync(); void init(); @@ -51,7 +51,7 @@ private: void startStopClicked(); private: - DatabaseFile db; + MonotoneHandlePtr db; bool running; }; ============================================================ --- src/view/dialogs/NewProjectSetup.cpp b82fc8e9f06b682ebf3d9dcc93ae0ee7eb40d9c1 +++ src/view/dialogs/NewProjectSetup.cpp 29884e89698c44e6957de65a002cacf1e2c584a1 @@ -24,8 +24,8 @@ #include #include -NewProjectSetup::NewProjectSetup(QWidget * parent, const DatabaseFile & database) - : Dialog(parent), db(database) +NewProjectSetup::NewProjectSetup(QWidget * parent, const MonotoneHandlePtr & handle) + : Dialog(parent), monotoneHandle(handle) { setupUi(this); Dialog::init(); @@ -41,7 +41,7 @@ void NewProjectSetup::init() void NewProjectSetup::init() { branch->clear(); - workspacePath->clear(); + monotoneHandle->clear(); } void NewProjectSetup::doSelectDirectory() @@ -52,14 +52,14 @@ void NewProjectSetup::doSelectDirectory( if (!path.isEmpty()) { - workspacePath->setText(path); + monotoneHandle->setText(path); } } void NewProjectSetup::accept() { QString branchName = branch->text().trimmed(); - QStringList revs = MonotoneUtil::resolveSelector(db, "b:" + branchName); + QStringList revs = MonotoneUtil::resolveSelector(monotoneHandle, "b:" + branchName); if (revs.size()) { QMessageBox::warning( @@ -74,7 +74,7 @@ void NewProjectSetup::accept() QDir workspaceDir; try { - workspaceDir = Platform::safeMakePath(workspacePath->text()); + workspaceDir = Platform::safeMakePath(monotoneHandle->text()); } catch (GuitoneException & e) { @@ -88,7 +88,7 @@ void NewProjectSetup::accept() return; } - if (!WorkspaceCreator::createBookkeepingDirectory(workspaceDir, db, branchName)) + if (!WorkspaceCreator::createBookkeepingDirectory(workspaceDir, handle, branchName)) { QMessageBox::critical( this, ============================================================ --- src/view/dialogs/NewProjectSetup.h 3eb92299feb93434a64e52c833168a16872b389b +++ src/view/dialogs/NewProjectSetup.h a438d90b69a566730ad4a3d9862188b267d7048b @@ -27,7 +27,7 @@ public: { Q_OBJECT public: - NewProjectSetup(QWidget *, const DatabaseFile &); + NewProjectSetup(QWidget *, const MonotoneHandlePtr &); ~NewProjectSetup(); void init(); @@ -35,7 +35,7 @@ private: void newProjectCreated(const QString &); private: - DatabaseFile db; + MonotoneHandlePtr db; private slots: void doSelectDirectory(); ============================================================ --- src/view/dialogs/OpenPrompt.cpp 74f3450be09bd97a1fe68ad0b2426fb3c2a9781f +++ src/view/dialogs/OpenPrompt.cpp f4b707f26ca5b624d17ff5b007d74fba042f8387 @@ -20,6 +20,7 @@ #include "Settings.h" #include +#include class GuitoneStandalone; @@ -39,6 +40,11 @@ OpenPrompt::OpenPrompt(QWidget * parent) ); connect( + btnNewConnection, SIGNAL(clicked()), + this, SLOT(newServerConnection()) + ); + + connect( btnExit, SIGNAL(clicked()), this, SIGNAL(quitApp()) ); @@ -57,9 +63,10 @@ OpenPrompt::OpenPrompt(QWidget * parent) connect( recentWorkspaces, SIGNAL(currentIndexChanged(int)), - this, SLOT(recentWorkspaceChanged(int)) + this, SLOT(recentWorkspacesChanged(int)) ); } + QStringList databases = Settings::getItemList("RecentDatabaseList"); if (databases.size() > 0) @@ -69,10 +76,23 @@ OpenPrompt::OpenPrompt(QWidget * parent) connect( recentDatabases, SIGNAL(currentIndexChanged(int)), - this, SLOT(recentDatabaseChanged(int)) + this, SLOT(recentDatabasesChanged(int)) ); } + QStringList servers = Settings::getItemList("RecentServerList"); + + if (servers.size() > 0) + { + recentServers->addItems(servers); + recentServers->setEnabled(true); + + connect( + recentServers, SIGNAL(currentIndexChanged(int)), + this, SLOT(recentServersChanged(int)) + ); + } + dialogManager = new DialogManager(this); connect( @@ -107,7 +127,7 @@ void OpenPrompt::openDatabase() this, tr("Select your database..."), QString(), - tr("monotone Databases (*.mtn *.db)") + tr("monotone Databases (*.mtn *.handle)") ); if (fn.isEmpty()) return; @@ -123,21 +143,38 @@ void OpenPrompt::openWorkspace() tr("Select your workspace...") ); - if (fn.isEmpty()) return; + if (fn.isEmpty()) + return; setDisabled(true); emit loadWorkspace(fn); } -void OpenPrompt::recentWorkspaceChanged(int idx) +void OpenPrompt::newServerConnection() { + bool ok; + QString connection = QInputDialog::getText( + this, + tr("Enter a new server connection"), + tr("Please enter a new server connection (f.e. mtn://my.server.com:4691):"), + QLineEdit::Normal, "mtn://", &ok).trimmed(); + + if (!ok || connection.isEmpty()) + return; + + setDisabled(true); + emit connectToServer(connection); +} + +void OpenPrompt::recentWorkspacesChanged(int idx) +{ // skip the first dummy item if (idx < 1) return; setDisabled(true); emit loadWorkspace(recentWorkspaces->itemText(idx)); } -void OpenPrompt::recentDatabaseChanged(int idx) +void OpenPrompt::recentDatabasesChanged(int idx) { // skip the first dummy item if (idx < 1) return; @@ -145,4 +182,11 @@ void OpenPrompt::recentDatabaseChanged(i emit loadDatabase(recentDatabases->itemText(idx)); } +void OpenPrompt::recentServersChanged(int idx) +{ + // skip the first dummy item + if (idx < 1) return; + setDisabled(true); + emit connectToServer(recentServers->itemText(idx)); +} ============================================================ --- src/view/dialogs/OpenPrompt.h 8ceff233c41326a951ee86ec30496258ea1759b4 +++ src/view/dialogs/OpenPrompt.h 496152432c142d198f9d2d9fbff89caa1729c41c @@ -33,13 +33,16 @@ signals: signals: void loadDatabase(const QString &); void loadWorkspace(const QString &); + void connectToServer(const QString &); void quitApp(); private slots: void openDatabase(); void openWorkspace(); - void recentDatabaseChanged(int); - void recentWorkspaceChanged(int); + void newServerConnection(); + void recentDatabasesChanged(int); + void recentWorkspacesChanged(int); + void recentConnectionsChanged(int); private: DialogManager * dialogManager; ============================================================ --- src/view/dialogs/RevisionDiff.cpp b4083373890e06ab5d2cded332fb1fbebf30a680 +++ src/view/dialogs/RevisionDiff.cpp c7c804577761f350c26bec42aac456b065dae1fb @@ -53,7 +53,7 @@ RevisionDiff::~RevisionDiff() delete diffModel; } -void RevisionDiff::forDatabase(const DatabaseFile & db, const QString & path, +void RevisionDiff::forDatabase(const MonotoneHandlePtr & handle, const QString & path, const QString & base, const QString & target) { baseRevision = base; @@ -62,10 +62,10 @@ void RevisionDiff::forDatabase(const Dat setWindowTitle(tr("Loading differences")); - diffModel->readDatabaseDiff(db, filePath, base, target); + diffModel->readDatabaseDiff(handle, filePath, base, target); } -void RevisionDiff::forWorkspace(const WorkspacePath & ws, const QString & path, +void RevisionDiff::forWorkspace(const MonotoneHandlePtr & handle, const QString & path, const QString & base, const QString & target) { baseRevision = base; @@ -74,7 +74,7 @@ void RevisionDiff::forWorkspace(const Wo setWindowTitle(tr("Loading differences")); - diffModel->readWorkspaceDiff(ws, filePath, base, target); + diffModel->readWorkspaceDiff(handle, filePath, base, target); } void RevisionDiff::triggerFileDiff(const QModelIndex & index) ============================================================ --- src/view/dialogs/RevisionDiff.h b895f3c22dc1e2451ffc60cbff06a6e52c453c79 +++ src/view/dialogs/RevisionDiff.h f251a593ff991f039cfa2ac281cef5c19e285b1d @@ -30,8 +30,8 @@ public: RevisionDiff(QWidget *); ~RevisionDiff(); - void forDatabase(const DatabaseFile &, const QString &, const QString &, const QString &); - void forWorkspace(const WorkspacePath &, const QString &, const QString &, const QString &); + void forDatabase(const MonotoneHandlePtr &, const QString &, const QString &, const QString &); + void forWorkspace(const MonotoneHandlePtr &, const QString &, const QString &, const QString &); signals: void fileDiff(const QString &, const QString &, const QString &); ============================================================ --- src/view/dialogs/RevisionManifest.cpp a03fa33d6be6ebe34d9f169e8fda2adc5cc66457 +++ src/view/dialogs/RevisionManifest.cpp 7414a9f682a105a38370ddba876dd259a532a002 @@ -28,13 +28,13 @@ #include #include -RevisionManifest::RevisionManifest(QWidget * parent, const QString & db) - : Dialog(parent), databaseFile(db) +RevisionManifest::RevisionManifest(QWidget * parent, const QString & handle) + : Dialog(parent), monotoneHandle(handle) { setupUi(this); Dialog::init(); - manifestModel = new Manifest(this, databaseFile); + manifestModel = new Manifest(this, monotoneHandle); manifestView->setModel(manifestModel); connect( @@ -80,7 +80,7 @@ void RevisionManifest::openFile(const QM if (entry->is_directory) return; MonotoneTaskPtr task(new MonotoneTask(QStringList() << "get_file" << entry->hash)); - MonotoneUtil::runSynchronousDatabaseTask(databaseFile, task); + MonotoneUtil::runSynchronousTask(monotoneHandle, task); if (!task->isFinished()) F("task aborted"); @@ -234,7 +234,7 @@ void RevisionManifest::saveAllFiles() QFileDialog::getExistingDirectory(0, tr("Select your export directory...")); if (!exportDir.isEmpty()) { - FileExporter exporter(databaseFile, revision, QDir(exportDir)); + FileExporter exporter(monotoneHandle, revision, QDir(exportDir)); FileEntryList entries = extractSelectedEntries(list); if (!exporter.run(entries)) @@ -268,7 +268,7 @@ void RevisionManifest::saveSelectedFiles QFileDialog::getExistingDirectory(0, tr("Select your export directory...")); if (!exportDir.isEmpty()) { - FileExporter exporter(databaseFile, revision, QDir(exportDir)); + FileExporter exporter(monotoneHandle, revision, QDir(exportDir)); if (!exporter.run(entries)) { QMessageBox::critical( ============================================================ --- src/view/dialogs/RevisionManifest.h b8fbf6ca8df3d1dbbb34cd5832d3c50f8403334b +++ src/view/dialogs/RevisionManifest.h 91d7ee0135363ad5696630f8fe05953ca14eea34 @@ -30,7 +30,7 @@ public: { Q_OBJECT public: - RevisionManifest(QWidget *, const DatabaseFile &); + RevisionManifest(QWidget *, const MonotoneHandlePtr &); ~RevisionManifest(); void readManifest(const QString &); @@ -45,7 +45,7 @@ private: Manifest * manifestModel; QString revision; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; private slots: void saveSelectedFiles(); ============================================================ --- src/view/dialogs/SelectRevision.cpp f9db3a6293905582be8c05cf580a0d2bc37e7608 +++ src/view/dialogs/SelectRevision.cpp 9dda96104478d3d3b3b9f15c74b8ed4ac06c78e3 @@ -24,8 +24,8 @@ #include #include -SelectRevision::SelectRevision(QWidget * parent, const DatabaseFile & database) - : Dialog(parent), selectorCompleter(0), databaseFile(database) +SelectRevision::SelectRevision(QWidget * parent, const MonotoneHandlePtr & database) + : Dialog(parent), selectorCompleter(0), monotoneHandle(database) { setupUi(this); Dialog::init(); @@ -42,12 +42,12 @@ SelectRevision::SelectRevision(QWidget * selectorBox->addItem(tr("Combined"), ""); // create the models - selectorModel = new Select(this, databaseFile); - sortModel = new Toposort(this, databaseFile); - certsModel = new Certs(this, databaseFile); - branchesModel = new Branches(this, databaseFile); - tagsModel = new Tags(this, databaseFile); - keysModel = new Keys(this, databaseFile); + selectorModel = new Select(this, monotoneHandle); + sortModel = new Toposort(this, monotoneHandle); + certsModel = new Certs(this, monotoneHandle); + branchesModel = new Branches(this, monotoneHandle); + tagsModel = new Tags(this, monotoneHandle); + keysModel = new Keys(this, monotoneHandle); // toposort revisions sortModel->setSourceModel(selectorModel); @@ -63,7 +63,7 @@ SelectRevision::SelectRevision(QWidget * // assign the models to the views revisionList->setModel(sortModel); - certList->setKeyMap(MonotoneUtil::getPublicKeyMap(databaseFile)); + certList->setKeyMap(MonotoneUtil::getPublicKeyMap(monotoneHandle)); connect( certsModel, SIGNAL(certsRead(const CertList &)), ============================================================ --- src/view/dialogs/SelectRevision.h 7b0eb080172fc538ab62dfd6328914f3e584dae8 +++ src/view/dialogs/SelectRevision.h b1160998f497b55aa6a290fef42c55404db3cf52 @@ -34,7 +34,7 @@ public: { Q_OBJECT public: - SelectRevision(QWidget *, const DatabaseFile &); + SelectRevision(QWidget *, const MonotoneHandlePtr &); ~SelectRevision(); void queryRevisions(const QString &); @@ -57,7 +57,7 @@ private: QString firstRevision; QString secondRevision; QString currentRevision; - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; private slots: void accept(); ============================================================ --- src/view/dialogs/UnaccountedRenames.cpp 3ccbb05cdd622261afd7e80dcfb0d29452a88aa9 +++ src/view/dialogs/UnaccountedRenames.cpp b61c61af418700ff7fb3b7bd199cbfc73a67b065 @@ -23,14 +23,14 @@ #include #include -UnaccountedRenames::UnaccountedRenames(QWidget * parent, const WorkspacePath & path) - : Dialog(parent), workspacePath(path), inventory(0) +UnaccountedRenames::UnaccountedRenames(QWidget * parent, const MonotoneHandlePtr & path) + : Dialog(parent), monotoneHandle(path), inventory(0) { setupUi(this); Dialog::init(); inventory = new Inventory(this); - inventory->setWorkspacePath(workspacePath); + inventory->setMonotoneHandle(monotoneHandle); connect( inventory, SIGNAL(inventoryRead(const QString &)), ============================================================ --- src/view/dialogs/UnaccountedRenames.h 35d7d6bf27df175ff17c1534ee81ae76a0311284 +++ src/view/dialogs/UnaccountedRenames.h da73f6ccb228250a4fcde5c030543e46fe6256ec @@ -28,7 +28,7 @@ public: { Q_OBJECT public: - UnaccountedRenames(QWidget *, const WorkspacePath &); + UnaccountedRenames(QWidget *, const MonotoneHandlePtr &); ~UnaccountedRenames(); void checkForUnaccountedRenames(); @@ -42,7 +42,7 @@ private: void doPerformRenames(); private: - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; Inventory * inventory; }; ============================================================ --- src/view/dialogs/UpdateWorkspace.cpp 9c46b834533239597ee91776ec1abfe9cabb422f +++ src/view/dialogs/UpdateWorkspace.cpp 1eadfe28917f0207dc0009c16426af3b6a8cb602 @@ -24,18 +24,18 @@ #include #include -UpdateWorkspace::UpdateWorkspace(QWidget * parent, const WorkspacePath & ws) - : Dialog(parent), workspacePath(ws) +UpdateWorkspace::UpdateWorkspace(QWidget * parent, const MonotoneHandlePtr & handle) + : Dialog(parent), monotoneHandle(handle) { setupUi(this); Dialog::init(); - DatabaseFile db = MonotoneUtil::getDatabaseFile(workspacePath); + MonotoneHandlePtr handle = MonotoneUtil::getMonotoneHandlePtr(monotoneHandle); - branchesModel = new Branches(this, db); + branchesModel = new Branches(this, handle); branchList->setModel(branchesModel); - tagsModel = new Tags(this, db); + tagsModel = new Tags(this, handle); tagList->setModel(tagsModel); selectorCompleter = new QCompleter( @@ -66,7 +66,7 @@ UpdateWorkspace::UpdateWorkspace(QWidget this, SLOT(selectSelectorOption()) ); - mtnProcess = new MonotoneProcess(workspacePath); + mtnProcess = new MonotoneProcess(monotoneHandle); connect( mtnProcess, SIGNAL(output(const QString &)), @@ -99,7 +99,7 @@ void UpdateWorkspace::init() updateToLatest->setText( tr("the latest revision (branch: %1)") - .arg(MonotoneUtil::getBranchName(workspacePath)) + .arg(MonotoneUtil::getBranchName(monotoneHandle)) ); updateSelection->setEnabled(true); @@ -113,7 +113,7 @@ void UpdateWorkspace::accept() if (updateToLatest->isChecked()) { - selector = "h:" + MonotoneUtil::getBranchName(workspacePath); + selector = "h:" + MonotoneUtil::getBranchName(monotoneHandle); } if (updateToBranch->isChecked()) @@ -167,7 +167,7 @@ void UpdateWorkspace::accept() } QStringList revList = MonotoneUtil::resolveSelector( - MonotoneUtil::getDatabaseFile(workspacePath), + MonotoneUtil::getMonotoneHandlePtr(monotoneHandle), selector ); @@ -197,10 +197,10 @@ void UpdateWorkspace::accept() selectedRevisionId = revList.at(0); QString baseRevisionId = - MonotoneUtil::getBaseWorkspaceRevision(workspacePath); + MonotoneUtil::getBaseWorkspaceRevision(monotoneHandle); QStringList commonAncestors = MonotoneUtil::getCommonAncestors( - MonotoneUtil::getDatabaseFile(workspacePath), + MonotoneUtil::getMonotoneHandlePtr(monotoneHandle), QStringList() << selectedRevisionId << baseRevisionId ); ============================================================ --- src/view/dialogs/UpdateWorkspace.h 9be3dd2b3cab3b6769fadf35865e81bd065f4f53 +++ src/view/dialogs/UpdateWorkspace.h f01bcf1974c3ead9e8ea6edf09a6a0dd9b113267 @@ -32,7 +32,7 @@ public: { Q_OBJECT public: - UpdateWorkspace(QWidget *, const WorkspacePath &); + UpdateWorkspace(QWidget *, const MonotoneHandlePtr &); ~UpdateWorkspace(); void init(); @@ -53,7 +53,7 @@ private: Tags * tagsModel; QCompleter * selectorCompleter; MonotoneProcess * mtnProcess; - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; QString selectedRevisionId; private slots: ============================================================ --- src/view/dialogs/WorkspaceDialogManager.cpp b0ef246f9747ea8da66a59c6cd236e99028eca0b +++ src/view/dialogs/WorkspaceDialogManager.cpp 77e476287fdaede8cb3f66fb4ae1bf27fa394899 @@ -45,10 +45,10 @@ void WorkspaceDialogManager::closeAllDia DatabaseDialogManager::closeAllDialogs(); } -void WorkspaceDialogManager::init(const WorkspacePath & path) +void WorkspaceDialogManager::init(const MonotoneHandlePtr & path) { - DatabaseDialogManager::init(APP->manager()->getDatabaseFilePath(path)); - workspacePath = path; + DatabaseDialogManager::init(APP->manager()->getMonotoneHandlePtrPath(path)); + monotoneHandle = path; cleanup(); } @@ -61,7 +61,7 @@ void WorkspaceDialogManager::showCommitR { if (!commitRevision) { - commitRevision = new CommitRevision(parentWidget(), workspacePath); + commitRevision = new CommitRevision(parentWidget(), monotoneHandle); connect( commitRevision, SIGNAL(revisionCommitted(const QString &)), @@ -90,14 +90,14 @@ void WorkspaceDialogManager::showFileDif fileDiff = new FileDiff(parentWidget()); } - fileDiff->forWorkspace(workspacePath, file, base, target); + fileDiff->forWorkspace(monotoneHandle, file, base, target); showDialog(fileDiff); } void WorkspaceDialogManager::showFileHistory(const QString & file) { DatabaseDialogManager::showFileHistory(file, - MonotoneUtil::getBaseWorkspaceRevision(workspacePath)); + MonotoneUtil::getBaseWorkspaceRevision(monotoneHandle)); } void WorkspaceDialogManager::showRevisionDiff(const QString & path, const QString & base, const QString & target) @@ -112,7 +112,7 @@ void WorkspaceDialogManager::showRevisio ); } - revisionDiff->forWorkspace(workspacePath, path, base, target); + revisionDiff->forWorkspace(monotoneHandle, path, base, target); showDialog(revisionDiff); } @@ -120,7 +120,7 @@ void WorkspaceDialogManager::checkForUna { if (!unaccountedRenames) { - unaccountedRenames = new UnaccountedRenames(parentWidget(), workspacePath); + unaccountedRenames = new UnaccountedRenames(parentWidget(), monotoneHandle); connect( unaccountedRenames, SIGNAL(renamePath(const QString &, const QString &)), @@ -135,7 +135,7 @@ void WorkspaceDialogManager::showUpdateW { if (!updateWorkspace) { - updateWorkspace = new UpdateWorkspace(parentWidget(), workspacePath); + updateWorkspace = new UpdateWorkspace(parentWidget(), monotoneHandle); connect( updateWorkspace, SIGNAL(selectRevisionFromSelector(const QString &)), @@ -165,7 +165,7 @@ void WorkspaceDialogManager::showAnnotat void WorkspaceDialogManager::showAnnotation(const QString & file) { DatabaseDialogManager::showAnnotation( - MonotoneUtil::getBaseWorkspaceRevision(workspacePath), + MonotoneUtil::getBaseWorkspaceRevision(monotoneHandle), file ); } ============================================================ --- src/view/dialogs/WorkspaceDialogManager.h 31e363829c58f3e3e4c3488f158d88e5e13ba8e0 +++ src/view/dialogs/WorkspaceDialogManager.h 7d9e1d7d0f5afdfd347c07ddce881a92f7a6c237 @@ -34,7 +34,7 @@ public: WorkspaceDialogManager(QWidget *); ~WorkspaceDialogManager(); - void init(const WorkspacePath &); + void init(const MonotoneHandlePtr &); void closeAllDialogs(); //! delegated signals @@ -63,7 +63,7 @@ private: private: void cleanup(); - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; }; #endif ============================================================ --- src/view/mainwindows/DatabaseWindow.cpp 2eaeb3de1cdce9efcb4049d3d1ef64f61f5f36bf +++ src/view/mainwindows/DatabaseWindow.cpp 1b6f36a8c142ed4ab0f731b13c4c9b707870036d @@ -150,12 +150,14 @@ void DatabaseWindow::setup() setCentralWidget(centralWidget); } -void DatabaseWindow::load(const QString & path) +void DatabaseWindow::load(const MonotoneHandlePtr & handle) { - APP->manager()->getThreadForDatabase(path); + I(handle->getType() == MonotoneHandle::workspace_handle); - databaseFile = path; + APP->manager()->getThread(handle); + monotoneHandle = path; + loadedDbLabel->setText(path); QFileInfo fi(path); @@ -165,8 +167,8 @@ void DatabaseWindow::load(const QString Settings::addItemToList("RecentDatabaseList", path, 5); - reinterpret_cast(dialogManager)->init(databaseFile); - databaseVariables->setDatabaseFile(databaseFile); + reinterpret_cast(dialogManager)->init(monotoneHandle); + databaseVariables->setMonotoneHandlePtr(monotoneHandle); QTimer::singleShot(0, this, SLOT(checkForEmptyDatabase())); } @@ -174,7 +176,7 @@ void DatabaseWindow::checkForEmptyDataba void DatabaseWindow::checkForEmptyDatabase() { bool ok; - if (MonotoneUtil::getRoots(databaseFile, ok).size() == 0 && ok) + if (MonotoneUtil::getRoots(monotoneHandle, ok).size() == 0 && ok) { QMessageBox msgBox(this); msgBox.setWindowFlags(Qt::Sheet); ============================================================ --- src/view/mainwindows/DatabaseWindow.h a2174a941fd5af62a44699d2a36bb08c078cbe6c +++ src/view/mainwindows/DatabaseWindow.h b8ddd05db7728d9f61015243934b874443793b3d @@ -38,7 +38,7 @@ protected: virtual void load(const QString &); protected: - DatabaseFile databaseFile; + MonotoneHandlePtr monotoneHandle; QLabel * loadedDbLabel; QPushButton * keyManagement; ============================================================ --- src/view/mainwindows/MainWindow.h 171feaed58e5a75246babdcf40797c188dfb5df0 +++ src/view/mainwindows/MainWindow.h cc7620bfdf1dc5fa47711d37f3d4229e2c83e5e6 @@ -31,7 +31,7 @@ public: virtual ~MainWindow(); virtual void init(); virtual void setup() = 0; - virtual void load(const QString &) = 0; + virtual void load(const MonotoneHandlePtr &) = 0; signals: void windowClosed(MainWindow *); ============================================================ --- src/view/mainwindows/WorkspaceWindow.cpp 6d1c97beb8ef58c1c6567a24c57e6ae267267834 +++ src/view/mainwindows/WorkspaceWindow.cpp 57032c33f3d551f0ea53b66b350f8cb7075f9c27 @@ -410,35 +410,34 @@ void WorkspaceWindow::setup() ); } -void WorkspaceWindow::load(const QString & path) +void WorkspaceWindow::load(const MonotoneHandlePtr & handle) { - workspacePath = MonotoneManager::normalizeWorkspacePath(path); - APP->manager()->getThreadForWorkspace(workspacePath); + I(handle->getType() == MonotoneHandle::workspace_handle); + APP->manager()->getThread(handle); + setWindowTitle( tr("%1 - workspace mode - guitone"). - arg(MonotoneUtil::getBranchNameShort(workspacePath)) + arg(MonotoneUtil::getBranchNameShort(handle)) ); - Settings::addItemToList("RecentWorkspaceList", workspacePath, 5); + Settings::addItemToList("RecentWorkspaceList", handle->getData(), 5); - reinterpret_cast(dialogManager)->init(workspacePath); + reinterpret_cast(dialogManager)->init(handle); - invModel->setWorkspacePath(workspacePath); - invWatcher->setWorkspacePath(workspacePath); - attrModel->setWorkspacePath(workspacePath); - nodeInfo->setWorkspacePath(workspacePath); + invModel->setMonotoneHandle(handle); + invWatcher->setMonotoneHandle(handle); + attrModel->setMonotoneHandle(handle); + nodeInfo->setMonotoneHandle(handle); + databaseVariables->setMonotoneHandle(handle); - DatabaseFile dbfile = APP->manager()->getDatabaseFilePath(workspacePath); - databaseVariables->setDatabaseFile(dbfile); - // read the inventory invModel->refresh(); } void WorkspaceWindow::openFile(const QString & filePath) { - QString completePath = workspacePath + "/" + filePath; + QString completePath = monotoneHandle + "/" + filePath; QFileInfo fileInfo(completePath); if (!fileInfo.exists()) @@ -487,7 +486,7 @@ void WorkspaceWindow::deleteLocalPath(co void WorkspaceWindow::deleteLocalPath(const QString & path) { - QString completePath = workspacePath + "/" + path; + QString completePath = monotoneHandle + "/" + path; QMessageBox::StandardButton btn = QMessageBox::question( this, @@ -570,11 +569,11 @@ void WorkspaceWindow::workspaceUpdated(c // need to ensure that the new branch set by mtn update before // doesn't get overwritten by any next workspace command issued // over stdio - APP->manager()->stopWorkspaceThreads(workspacePath); + APP->manager()->stopWorkspaceThreads(monotoneHandle); setWindowTitle( tr("%1 - workspace mode - guitone"). - arg(MonotoneUtil::getBranchNameShort(workspacePath)) + arg(MonotoneUtil::getBranchNameShort(monotoneHandle)) ); invModel->refresh(); ============================================================ --- src/view/mainwindows/WorkspaceWindow.h d707e8956f801c8e6f9b2a6fe8eceb78b61de885 +++ src/view/mainwindows/WorkspaceWindow.h 068de7167552a414e2d954d1ff95d920fd5a462e @@ -45,11 +45,10 @@ public: virtual void init(); virtual void setup(); - //! throws GuitoneException - virtual void load(const QString &); + virtual void load(const MonotoneHandlePtr &); protected: - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; Splitter * mainSplitter; Splitter * listSplitter; ============================================================ --- src/view/panels/DatabaseVariables.cpp a3d0ea6257c7a5f4754b652db1fcde62eea842e7 +++ src/view/panels/DatabaseVariables.cpp 8e17715d1ae3e68a26f33ffefc03577673ce7d1f @@ -73,9 +73,9 @@ DatabaseVariables::~DatabaseVariables() delete databaseVariables; } -void DatabaseVariables::setDatabaseFile(const DatabaseFile & db) +void DatabaseVariables::setMonotoneHandlePtr(const MonotoneHandlePtr & handle) { - databaseVariables->setDatabaseFile(db); + databaseVariables->setMonotoneHandlePtr(handle); // FIXME: this is hacky, but we can't properly determine when to // read the variables other than here or on every view change // (see QDockWidget::visibilityChanged(bool) for that purpose), but ============================================================ --- src/view/panels/DatabaseVariables.h 18f5901a440cc1179edc722b1c611d1ee92c9068 +++ src/view/panels/DatabaseVariables.h 4b133dedc8498f69a3029de272939505086c97ba @@ -32,7 +32,7 @@ public slots: ~DatabaseVariables(); public slots: - void setDatabaseFile(const DatabaseFile &); + void setMonotoneHandlePtr(const MonotoneHandlePtr &); private slots: void variablesRead(); ============================================================ --- src/view/panels/NodeInfo.cpp 427059e0d6bd2dd1a453c6b98918c05a1514d92e +++ src/view/panels/NodeInfo.cpp 725716d4a5da526c6e59ebffa7382c03fb1706de @@ -49,9 +49,9 @@ NodeInfo::~NodeInfo() {} NodeInfo::~NodeInfo() {} -void NodeInfo::setWorkspacePath(const WorkspacePath & wp) +void NodeInfo::setMonotoneHandle(const MonotoneHandlePtr & handle) { - workspacePath = wp; + monotoneHandle = handle; } void NodeInfo::setItem(const InventoryItem * item) @@ -63,7 +63,7 @@ void NodeInfo::readAndSetInfo() { if (inventoryItem == 0) return; - I(!workspacePath.isEmpty()); + I(!monotoneHandle.isEmpty()); QString strLastChangeRevision("-"), strLastChangeAuthor("-"), @@ -82,9 +82,9 @@ void NodeInfo::readAndSetInfo() path = inventoryItem->getRenameSource(); } - DatabaseFile db = MonotoneUtil::getDatabaseFile(workspacePath); QStringList revs = MonotoneUtil::getPreviousContentMarks( - db, path, MonotoneUtil::getBaseWorkspaceRevision(workspacePath) + monotoneHandle, path, + MonotoneUtil::getBaseWorkspaceRevision(monotoneHandle) ); I(revs.size() > 0); @@ -100,7 +100,7 @@ void NodeInfo::readAndSetInfo() .arg(revs.at(0)) .arg(revs.at(0).left(12)); - CertList certs = MonotoneUtil::getCerts(db, revs.at(0)); + CertList certs = MonotoneUtil::getCerts(monotoneHandle, revs.at(0)); strLastChangeAuthor = certs.findByNameValues("author").join(", "); @@ -137,7 +137,7 @@ void NodeInfo::readAndSetInfo() if (inventoryItem->getFSType() != InventoryItem::None) { - QFileInfo fileInfo(workspacePath + "/" + inventoryItem->getPath()); + QFileInfo fileInfo(monotoneHandle + "/" + inventoryItem->getPath()); I(fileInfo.exists()); strFileSize = QString("%1 KB").arg(fileInfo.size() / 1024); // FIXME: use Qt::DefaultLocaleShortDate if support for Qt 4.3 is dropped @@ -225,3 +225,4 @@ void NodeInfo::showEvent(QShowEvent * ev Q_UNUSED(ev); readAndSetInfo(); } + ============================================================ --- src/view/panels/NodeInfo.h d99d10fed6ffaf7817948cac2fda0fa4120326a9 +++ src/view/panels/NodeInfo.h da7bfab77b9e00ce784c8fb3e0b7f6f2a8984554 @@ -30,7 +30,7 @@ public: public: NodeInfo(QWidget *); ~NodeInfo(); - void setWorkspacePath(const WorkspacePath &); + void setMonotoneHandle(const MonotoneHandlePtr &); signals: void showSelectRevision(const QString &); @@ -42,7 +42,7 @@ private: private: void showEvent(QShowEvent *); - WorkspacePath workspacePath; + MonotoneHandlePtr monotoneHandle; const InventoryItem * inventoryItem; }; ============================================================ --- src/vocab.h 45f37ad58d947f6ab3e7b07d314fd62f54c5356c +++ src/vocab.h 6d7889ef50ac0ea2b509b5930cddfd2efc118880 @@ -52,9 +52,7 @@ struct StanzaEntry QStringList vals; StanzaEntry() {} - StanzaEntry(QString s, QString h) : sym(s), hash(h) {} - StanzaEntry(QString s, QStringList v) : sym(s), vals(v) {} }; @@ -70,9 +68,7 @@ struct FileEntry QMap attrs; FileEntry() {} - FileEntry(QString p, bool d) : path(p), is_dir(d) {} - FileEntry(QString p, bool d, QString f) : path(p), is_dir(d), fileid(f) {} inline bool operator<(const FileEntry & other) const @@ -83,203 +79,6 @@ typedef QList FileEntryList; typedef QList FileEntryList; -typedef QStringList RevisionList; - -#include -struct Cert -{ - enum Trust { Trusted, Untrusted } trust; - enum Signature { Ok, Bad, Unknown } signature; - QString key; - QString name; - QString value; - - QDateTime dateTimeValue() const - { - return QDateTime::fromString(value, "yyyy-MM-ddThh:mm:ss"); - } - - QString plainValue() const - { - return QString(value).replace(QRegExp("\\s+"), " "); - } - - QString htmlValue() const - { - QString val(value); - QStringList lines = val.replace("<", "<").split(QRegExp("(\\r\\n|\\n|\\n\\r)")); - QString htmlValue; - bool inList = false; - foreach (const QString & line, lines) - { - if (line.isEmpty()) - { - if (inList) - { - htmlValue += "\n\n"; - inList = false; - continue; - } - - htmlValue += "
\n"; - continue; - } - bool listStart = (0 == line.indexOf(QRegExp("^[*-]"))); - if (listStart) - { - if (inList) - { - htmlValue += "\n"; - } - else - { - inList = true; - htmlValue += "
    \n"; - } - - htmlValue += "
  • " + line.mid(1).trimmed(); - continue; - } - if (inList) - { - htmlValue += " " + line.trimmed(); - continue; - } - htmlValue += line.trimmed() + "
    \n"; - } - if (inList) - { - htmlValue += "
  • \n
\n"; - } - return htmlValue - .replace(QRegExp("(\\b)([_])(\\w+)\\2"), "\\1\\2\\3\\2") - .replace(QRegExp("(\\b)([*])(\\w+)\\2"), "\\1\\2\\3\\2") - .replace(QRegExp("(https?://[^() ]+)"), "\\1") - .replace(QRegExp("\\t"), "    "); - } -}; - -struct CertList -{ - QString revision; - QList certs; - - void add(const Cert & c) { certs.push_back(c); } - - int size() const { return certs.size(); } - - Cert at(int pos) const { return certs.at(pos); } - - void clear() - { - certs.clear(); - revision = QString(); - } - - QStringList signers() const - { - QStringList signers; - foreach (const Cert & cert, certs) - { - if (!signers.contains(cert.key)) - signers.push_back(cert.key); - } - return signers; - } - - QList findBySigner(const QString & key = QString()) const - { - QList foundCerts; - foreach (const Cert & cert, certs) - { - if (key.isEmpty() || key == cert.key) - foundCerts.push_back(cert); - } - return foundCerts; - } - - QList findByName(const QString & name, const QString & key = QString()) const - { - QList foundCerts; - foreach (const Cert & cert, findBySigner(key)) - { - if (cert.name != name) - continue; - foundCerts.push_back(cert); - } - return foundCerts; - } - - QStringList findByNameValues(const QString & name, const QString & key = QString()) const - { - QStringList values; - QList certs = findByName(name, key); - foreach (const Cert & cert, certs) - { - values.push_back(cert.value); - } - return values; - } - - void fill(const StanzaList & stanzas) - { - foreach (const Stanza & st, stanzas) - { - Cert cert; - foreach (const StanzaEntry & entry, st) - { - if (entry.sym == "key") - { - I(!entry.hash.isEmpty()); - cert.key = entry.hash; - continue; - } - if (entry.sym == "name") - { - I(entry.vals.size() == 1); - cert.name = entry.vals.at(0); - continue; - } - if (entry.sym == "value") - { - I(entry.vals.size() == 1); - cert.value = entry.vals.at(0).trimmed(); - continue; - } - if (entry.sym == "signature") - { - I(entry.vals.size() == 1); - QString sig = entry.vals.at(0); - if (sig == "ok") - cert.signature = Cert::Ok; - else if (sig == "bad") - cert.signature = Cert::Bad; - else if (sig == "unknown") - cert.signature = Cert::Unknown; - else - W(QString("Unknown cert signature state '%1'.").arg(sig)); - continue; - } - if (entry.sym == "trust") - { - I(entry.vals.size() == 1); - QString trust = entry.vals.at(0); - if (trust == "trusted") - cert.trust = Cert::Trusted; - else if (trust == "untrusted") - cert.trust = Cert::Untrusted; - else - W(QString("Unknown cert trust '%1'.").arg(trust)); - continue; - } - } - if (cert.key.isEmpty()) - continue; - add(cert); - } - } -}; - typedef QList ByteArrayList; struct Ticker @@ -342,14 +141,11 @@ class MonotoneTask; #include class MonotoneThread; class MonotoneTask; +class MonotoneHandle; typedef QSharedPointer MonotoneThreadPtr; typedef QSharedPointer MonotoneTaskPtr; +typedef QSharedPointer MonotoneHandlePtr; -// FIXME: just a few stupid typedefs which should be expanded later on -// to more "intelligent" objects -typedef QString WorkspacePath; -typedef QString DatabaseFile; - #include class GuitoneException : public std::exception {